2016-01-27 2 views
0

Я реферировал некоторый вебсайт но я не могу понять как могу я получить значение от вращающейся ручки. Ниже приведен пример кода примера. Что мне нужно, когда поворачивайте правую сторону ручки, я хочу увеличить значение в текстовом представлении, в то же время поворот левой стороны означает уменьшение значения в текстовом представлении. Минимальное значение равно 0 и максимальное значение 25.RotaryKnob using получить значение прогресса в текстовом виде

RotaryKnobView класс здесь

public class RotaryKnobView extends ImageView { 

private float angle = 0f; 
private float theta_old=0f; 

private RotaryKnobListener listener; 

public interface RotaryKnobListener { 
    public void onKnobChanged(int arg); 
} 

public void setKnobListener(RotaryKnobListener l) 
{ 
    listener = l; 
} 

public RotaryKnobView(Context context) { 
    super(context); 
    initialize(); 
} 

public RotaryKnobView(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
    initialize(); 
} 

public RotaryKnobView(Context context, AttributeSet attrs, int defStyle) 
{ 
    super(context, attrs, defStyle); 
    initialize(); 
} 

private float getTheta(float x, float y) 
{ 
    float sx = x - (getWidth()/2.0f); 
    float sy = y - (getHeight()/2.0f); 

    float length = (float)Math.sqrt(sx*sx + sy*sy); 
    float nx = sx/length; 
    float ny = sy/length; 
    float theta = (float)Math.atan2(ny, nx); 

    final float rad2deg = (float)(180.0/Math.PI); 
    float thetaDeg = theta*rad2deg; 

    return (thetaDeg < 0) ? thetaDeg + 360.0f : thetaDeg; 
} 

public void initialize() 
{ 
    this.setImageResource(R.drawable.ic_launcher); 
    setOnTouchListener(new OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      float x = event.getX(0); 
      float y = event.getY(0); 
      float theta = getTheta(x,y); 

      switch(event.getAction() & MotionEvent.ACTION_MASK) 
      { 
      case MotionEvent.ACTION_POINTER_DOWN: 
       theta_old = theta; 
       break; 
      case MotionEvent.ACTION_MOVE: 
       invalidate(); 
       float delta_theta = theta - theta_old; 
       theta_old = theta; 
       int direction = (delta_theta > 0) ? 1 : -1; 
       angle += 3*direction; 
       notifyListener(direction); 
       break; 
      } 
      return true; 
     } 
    }); 
} 

private void notifyListener(int arg) 
{ 
    if (null!=listener) 
     listener.onKnobChanged(arg); 
} 

protected void onDraw(Canvas c) 
{ 
    c.rotate(angle,getWidth()/2,getHeight()/2); 
    super.onDraw(c); 
} 

Главный код класса активности здесь

код
final TextView tView = (TextView)findViewById(R.id.tv); 
    RotaryKnobView jogView = (RotaryKnobView)findViewById(R.id.knob); 
    jogView.setKnobListener(new RotaryKnobView.RotaryKnobListener() 
    { 
     @Override 
     public void onKnobChanged(int progress) { 

      if (progress > 0){ 
       // rotate right 
       tView.setText(""+progress); 
      } else{ 
       // rotate left 
       tView.setText(""+progress); 
      } 
     } 
    }); 

MainActivity Xml здесь

<com.example.ghvhjf.RotaryKnobView 
    android:id="@+id/knob" 
    android:layout_width="100dip" 
    android:layout_height="100dip" /> 

<TextView 
    android:id="@+id/tv" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

ответ

1

Ваш слушатель не информирован о достигнутом прогрессе; только о направлении поворота, как можно видеть здесь:

int direction = (delta_theta > 0) ? 1 : -1; 
notifyListener(direction); 

Таким образом, вы можете отслеживать и суммировать эти изменения в вашем RotaryKnobListener:

new RotaryKnobView.RotaryKnobListener() { 

    private int progress = 0; 

    @Override 
    public void onKnobChanged(int direction) { 
     progress += direction; 
     progress = Math.max(0, Math.min(25, progress)); 
     tView.setText(Integer.toString(progress)); 
    } 
} 
+0

Большое спасибо за ваше руководство это почти рабочий для мое требование спасибо за ваше предложение. – Rakesh

+0

При касании ручки он автоматически поворачивает левую сторону и достигает максимального значения, но мне нужно как изменить угол на обе стороны и шаг за шагом увеличить значение? – Rakesh

+0

Я предполагаю, что 25 обращений к обратному вызову происходят практически мгновенно; слишком быстро наблюдать. Вы можете попытаться замедлить этот процесс. Самая простая возможность: закрепите накопленный прогресс между 0 и 2500 и разделите отображаемое значение на 100, прежде чем устанавливать текст TextView. – toKrause

Смежные вопросы