Я реферировал некоторый вебсайт но я не могу понять как могу я получить значение от вращающейся ручки. Ниже приведен пример кода примера. Что мне нужно, когда поворачивайте правую сторону ручки, я хочу увеличить значение в текстовом представлении, в то же время поворот левой стороны означает уменьшение значения в текстовом представлении. Минимальное значение равно 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" />
Большое спасибо за ваше руководство это почти рабочий для мое требование спасибо за ваше предложение. – Rakesh
При касании ручки он автоматически поворачивает левую сторону и достигает максимального значения, но мне нужно как изменить угол на обе стороны и шаг за шагом увеличить значение? – Rakesh
Я предполагаю, что 25 обращений к обратному вызову происходят практически мгновенно; слишком быстро наблюдать. Вы можете попытаться замедлить этот процесс. Самая простая возможность: закрепите накопленный прогресс между 0 и 2500 и разделите отображаемое значение на 100, прежде чем устанавливать текст TextView. – toKrause