2

私は Android アプリケーションを開発していますが、1 つの軸を固定して移動方向を検出できるかどうかを知りたいです。たとえば、携帯電話をテーブルに置いて、それを動かしたときに方向 (左、右、上、下) を検出したいとします。距離は必要ありません。正確な方向を知りたいだけです。

ありがとう!

私のコードは次のとおりです。

arg1.setOnTouchListener(new OnTouchListener() {

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

                    float startX = 0;
                    float startY;
                    float endX;
                    float endY;
                    switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        startX = (int) event.getX();
                        startY = (int) event.getY();
                        System.out.println("startX" + startX);
                        System.out.println("startY" + startY);
                        break;
                    case MotionEvent.ACTION_MOVE:

                        endX = event.getX();
                        endY = (int) event.getY();
                        System.out.println("endX" + endX);
                        System.out.println("endY" + endY);
                        float sub = endX - startX;
                        System.out.println("sub" + sub);
                        if ((endX - startX) < 100) {
                            arg0.setBackgroundColor(Color.GREEN);

                        }
                        if ((endX - startX) > 100) {
                            try {
                                TextView ph_tv = (TextView) arg0
                                        .findViewById(R.id.textnum);
                                String Pho_no = ph_tv.getText().toString();
                                arg0.setBackgroundColor(Color.RED);
                                Intent intent = new Intent(
                                        Intent.ACTION_CALL, Uri
                                                .parse("tel:" + Pho_no));
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                startActivity(intent);
                                lv.setBackgroundColor(Color.BLACK);

                            } catch (ActivityNotFoundException e) {
                                Toast.makeText(
                                        getApplicationContext(),
                                        "Error in your phone call"
                                                + e.getMessage(),
                                        Toast.LENGTH_LONG).show();

                            }
                            section(path_name, lv1);

                        }
                        break;

                    case MotionEvent.ACTION_UP:
                        endX = (int) event.getX();
                        endY = (int) event.getY();
                    }
                    return true;
                }

            });
4

2 に答える 2

2

指の動きの方向を検出したい場合は、 onTouchListener を使用するのは良い解決策ではないと思います。ジェスチャリスナーを使用することをお勧めします。これは左右の例です

class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                // right to left swipe
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Toast.makeText(SelectFilterActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
                }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Toast.makeText(SelectFilterActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                // nothing
            }
            return false;
        }

    }

Y距離を計算して上下に同じことを行うことができます

私の回答について他に質問がある場合、または私の回答が十分に明確ではないと感じた場合は、お気軽にコメントに質問を残してください:)

私の答えがお役に立てば幸いです!

于 2013-02-18T11:13:58.183 に答える
1
private final int mDragInterwell = 5;

private Point mStartPoint;

private final 

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

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        mStartPoint = new Point(event.getX(), event.getY());
        break;
    case MotionEvent.ACTION_MOVE:

        final Point current = new Point(event.getX(), event.getY());
        Log.d(getClass().getName(), decideMovement(current));
        break;

    case MotionEvent.ACTION_UP:
       break;
    }
    return true;
}

private String decideMovement(final Point point)
{
    String direction = "invalid";
    boolean changed  = false;
    if( ( mStartPoint.x - point.x ) > mDragInterwell )
    {
        direction = "left";
        changed   = true;
    }else if(  ( mStartPoint.x - point.x ) > -mDragInterwell  )
    {
        changed   = true;
        direction = "right";
    }else if(  ( mStartPoint.y - point.y ) > mDragInterwell  )
    {
        changed   = true;
        direction = "down";
    }else if(  ( mStartPoint.y - point.y ) > -mDragInterwell  )
    {
        changed   = true;
        direction = "up";
    }
    if(changed)
    {
        mStartPoint = point;
    }
    return direction;
}

これが役立つことを願っています..

于 2013-02-18T11:27:46.673 に答える