2012-06-18 1 views
0

Я пишу виртуальный виджет джойстика, который состоит из большого круга в качестве зоны с кликом и меньшего круга, представляющего фактический джойстик. Чтобы сделать манипуляции немного легче, я хочу, чтобы пользователь мог касаться в любом месте большего круга, а меньший круг переместился бы в положение касания. Если пользователь перетаскивает палец, мне нужен небольшой круг. Когда маленький круг выпущен, я хочу, чтобы он вернулся в исходное положение в центре большого круга. Я использую относительную компоновку с обоими кругами, центрированными по горизонтали и вертикали.Нужно изображение, чтобы перейти на сайт щелчка на Android

Вот прослушиватель прикосновений, который я использую, сейчас он работает в основном так, как я хочу, за исключением того, что меньший круг появляется вверху и слева от того места, где есть прикосновение. Я не могу понять, как заставить его вернуться в центр, когда его выпустили.

OnTouchListener touchListener = new OnTouchListener() { 
     @Override 
     public boolean onTouch(View arg0, MotionEvent event) 
     { 
      // TODO Auto-generated method stub 
      status.setText("X: " + event.getX() + ", Y: " + event.getY()); 
      knob.setX(event.getX()); 
      knob.setY(event.getY()); 
      return false; 
     } 
    }; 

ответ

0

Ни один из них не должен быть ImageViews. Вы должны создать пользовательский вид и переопределить метод onDraw. Вы можете управлять рисованием, переопределяя метод onTouch. Это должно выглядеть примерно так:

public class Joystick extends View { 
    float touchX = -1, touchY = -1; 

    @Override 
    public Joystick(Context context) { 
     super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     Paint mPaint = new Paint(); 
     mPaint.setColor(myColor); 
     mPaint.setStyle(Paint.Style.STROKE); 
     float width = getMeasuredWidth(); 
     float height = getMeasuredHeight(); 
     canvas.drawCircle(width/2, height/2, mPaint); //draw outer circle 

     //Draw inner circle 
     if (touchX > -1 && touchY > -1) { 
      canvas.drawCircle(touchX, touchY, mPaint); 
     } else { 
      canvas.drawCircle(width/2, height/2, mPaint); 
     } 
    } 

    @Override 
    public void onTouchEvent(MotionEvent me) { 
     switch (me.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     case MotionEvent.ACTION_MOVE: 
      touchX = me.getX(); 
      touchY = me.getY(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touchX = -1; 
      touchY = -1; 
     } 
     invalidate(); 
    } 
} 

Приветствие

+0

Это работает отлично подходит для отображения кругов, однако внутренний круг не перемещается при касании экрана. Я прошел через отладчик и решил, что касания фактически регистрируют и извлекают действительные значения x и y. – Jordan

+0

Nevermind, оказывается, мне нужно добавить 'invalidate()' после переключения, чтобы он перерисовал холст. – Jordan

+0

Ах да, я забыл бросить это там. Хороший улов и удача! –

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