назначить .setOnTouchListener () для макета, определенного в XML - PullRequest
1 голос
/ 03 февраля 2012

Я новичок в Android, поэтому все, что я пытаюсь сделать, - это запрограммировать приложение с несколькими представлениями, взаимодействующими с пользователем. Мой подход состоит в том, чтобы определить макет с некоторыми изображениями в XML-файле и затем программно обрабатывать события в этих изображениях. Однако у меня возникла проблема с назначением .setOnTouchListener () для RelativeLayout, ранее определенного в xml.

код выглядит так:

public class ThreeActivity extends Activity implements OnTouchListener {

    ImageView iv2;
    RelativeLayout rl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fish);

        ImageView iv1 = (ImageView) findViewById(R.id.ImageView02);
        iv1.setAlpha(50);


        iv2 = (ImageView) findViewById(R.id.ImageView01);
        iv2.setId(2);
        iv2.setOnTouchListener(this);

        iv2.setFocusable(true);

    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (iv2.isFocused()) {
            TranslateAnimation translateAnim = new TranslateAnimation(
                    iv2.getLeft(), event.getX(), iv2.getTop(), event.getY());

            translateAnim.setDuration(1000);
            translateAnim
                    .setInterpolator(new AccelerateDecelerateInterpolator());
            translateAnim.setFillAfter(true);

            iv2.setAnimation(translateAnim);

            iv2.startAnimation(translateAnim);
        }
        return true;
        }


}

очевидно, я хочу, чтобы просмотр изображения был фокусируемым, чтобы получать несколько событий, а затем перемещать его в положение касания. И вот тут у меня проблемы. В RelativeLayout, к которому я прикасаюсь, не настроен сенсорный приемник, поэтому я не могу с ним взаимодействовать.

Можете ли вы помочь мне с этим или порекомендовать другой путь? Спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

Рекомендую прочитать немного о классе MotionEvent .Обратите особое внимание на метод getAction() и все маски действий, которые предоставляет вам этот класс.

В вашем методе onTouch() вы можете сделать что-то вроде этого:

if (v != iv2) return;
switch(ev.getAction()) {    
    case ACTION_DOWN: {
        // This block will run when the finger touches the screen
        mDoDrag = true;
        break;
    }    
    case ACTION_UP: {
        // This block will run when the finger leaves the screen
        mDoDrag = false;
        break;
    }    
    case ACTION_MOVE: {
        // This block will run when the finger is dragged across the screen
        if (mDoDrag) {
             // You should implement your animation here
        }
        break;
    }
}
0 голосов
/ 08 сентября 2013

, если setOnTouchListener не работает для вашего макета, вы можете расширить его и обработать onInterceptTouchEvent

0 голосов
/ 03 февраля 2012
public class ThreeActivity extends Activity implements OnTouchListener {

    ImageView iv2;
    RelativeLayout rl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fish);

        ImageView iv1 = (ImageView) findViewById(R.id.ImageView02);
        iv1.setAlpha(50);


        iv2 = (ImageView) findViewById(R.id.ImageView01);
        iv2.setId(2);
        r1.setOnTouchListener(this);

        iv2.setFocusable(true);

    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (v == iv2) {
            TranslateAnimation translateAnim = new TranslateAnimation(
                    iv2.getLeft(), event.getX(), iv2.getTop(), event.getY());

            translateAnim.setDuration(1000);
            translateAnim
                    .setInterpolator(new AccelerateDecelerateInterpolator());
            translateAnim.setFillAfter(true);

            iv2.setAnimation(translateAnim);

            iv2.startAnimation(translateAnim);
        }
        return true;
        }


}
...