首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android onTouch事件

Android onTouch事件
EN

Stack Overflow用户
提问于 2016-06-14 15:59:26
回答 1查看 722关注 0票数 1

我想要创建一个应用程序,在那里我可以改变GridLayout手势的颜色。GridLayout可以很好地处理以下代码:

代码语言:javascript
复制
@Override
public void onDraw(Canvas canvas) {
    if (touchOn) {
        canvas.drawColor(Color.RED);
    } else {
        canvas.drawColor(Color.GRAY);
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);
    touchOn = true;
    invalidate();
    return true;
}

使用xml代码:

代码语言:javascript
复制
<GridLayout
    android:id="@+id/mygrid"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:columnCount="8"
    android:rowCount="8"
    android:layout_gravity="center"
    android:background="@android:color/background_light"
    android:layout_below="@+id/linearLayout3">
</GridLayout>

但我只能通过触摸网格来更改one手势的颜色。是否有MotionEvent或其他东西检测到我已经触摸了一个手势,并将(没有摘下手指)移动到下一个手势?这样我就可以用手指在网格上移动,颜色也会一个接一个地变化。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-06-14 16:12:28

您可以通过在您的GestureDetector.OnGestureListener中实现MainActivityGestureDetector.OnDoubleTapListener方法来检测手势,并更改每个手势的颜色:

代码语言:javascript
复制
public class MainActivity extends Activity implements 
        GestureDetector.OnGestureListener,
        GestureDetector.OnDoubleTapListener{

    private static final String DEBUG_TAG = "Gestures";
    private GestureDetectorCompat mDetector; 

    // Called when the activity is first created. 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Instantiate the gesture detector with the
        // application context and an implementation of
        // GestureDetector.OnGestureListener
        mDetector = new GestureDetectorCompat(this,this);
        // Set the gesture detector as the double tap
        // listener.
        mDetector.setOnDoubleTapListener(this);
    }

    @Override 
    public boolean onTouchEvent(MotionEvent event){ 
        this.mDetector.onTouchEvent(event);
        // Be sure to call the superclass implementation
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent event) { 
        Log.d(DEBUG_TAG,"onDown: " + event.toString()); 
        return true;
    }

    @Override
    public boolean onFling(MotionEvent event1, MotionEvent event2, 
            float velocityX, float velocityY) {
        Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
        return true;
    }

    @Override
    public void onLongPress(MotionEvent event) {
        Log.d(DEBUG_TAG, "onLongPress: " + event.toString()); 
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        Log.d(DEBUG_TAG, "onScroll: " + e1.toString()+e2.toString());
        return true;
    }

    @Override
    public void onShowPress(MotionEvent event) {
        Log.d(DEBUG_TAG, "onShowPress: " + event.toString());
    }

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
        return true;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());
        return true;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent event) {
        Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
        return true;
    }
}

你也可以在接触事件中跟踪运动。

您可以有一个基于运动的手势,它只是基于指针移动的距离和/或方向。但是速度往往是跟踪手势特征,甚至决定手势是否发生的决定性因素。为了简化速度计算,Android在Support中提供了VelocityTracker类和VelocityTrackerCompat类。VelocityTracker帮助您跟踪触摸事件的速度。这对于速度是手势标准的一部分的手势是有用的,比如放纵。

下面是一个例子。

代码语言:javascript
复制
public class MainActivity extends Activity {
    private static final String DEBUG_TAG = "Velocity";
        ...
    private VelocityTracker mVelocityTracker = null;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int index = event.getActionIndex();
        int action = event.getActionMasked();
        int pointerId = event.getPointerId(index);

        switch(action) {
            case MotionEvent.ACTION_DOWN:
                if(mVelocityTracker == null) {
                    // Retrieve a new VelocityTracker object to watch the velocity of a motion.
                    mVelocityTracker = VelocityTracker.obtain();
                }
                else {
                    // Reset the velocity tracker back to its initial state.
                    mVelocityTracker.clear();
                }
                // Add a user's movement to the tracker.
                mVelocityTracker.addMovement(event);
                break;
            case MotionEvent.ACTION_MOVE:
                mVelocityTracker.addMovement(event);
                // When you want to determine the velocity, call 
                // computeCurrentVelocity(). Then call getXVelocity() 
                // and getYVelocity() to retrieve the velocity for each pointer ID. 
                mVelocityTracker.computeCurrentVelocity(1000);
                // Log velocity of pixels per second
                // Best practice to use VelocityTrackerCompat where possible.
                Log.d("", "X velocity: " + 
                        VelocityTrackerCompat.getXVelocity(mVelocityTracker, 
                        pointerId));
                Log.d("", "Y velocity: " + 
                        VelocityTrackerCompat.getYVelocity(mVelocityTracker,
                        pointerId));
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                // Return a VelocityTracker object back to be re-used by others.
                mVelocityTracker.recycle();
                break;
        }
        return true;
    }
}

请参阅https://developer.android.com/training/gestures/detector.html

当用户在触摸屏上放置一个或多个手指,应用程序将该触摸模式解释为特定的手势时,就会出现“触摸手势”。相应地,手势检测有两个阶段:

  • 收集关于触摸事件的数据。
  • 对数据进行解释,看看它是否符合应用程序所支持的任何手势的标准。

https://developer.android.com/training/gestures/movement.html#velocity

每当当前触点接触位置、压力或大小发生变化时,都会通过ACTION_MOVE事件触发新的ACTION_MOVE()。正如在检测公共手势中所描述的,所有这些事件都记录在onTouchEvent()的onTouchEvent参数中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37816922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档