我想创建一个App,我可以在其中更改GridLayout手势的颜色。 My_GridLayout 它适用于以下代码:
@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代码:
<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>
但我只能通过触摸网格来改变一个手势的颜色。是否有一个MotionEvent或其他东西检测到我触摸了一个手势并移动(没有取下手指)到下一个手势?这样我就可以用手指在网格上移动,颜色会一个接一个地改变。
感谢!!!
答案 0 :(得分:1)
您可以通过在GestureDetector.OnGestureListener
中实施GestureDetector.OnDoubleTapListener
和MainActivity
方法来检测手势,并更改每个手势的颜色:
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提供了VelocityTracker类和 支持库中的VelocityTrackerCompat类。 VelocityTracker 帮助您跟踪触摸事件的速度。这很有用 手势,其中速度是手势标准的一部分, 比如一时冲动。
这是一个例子。
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:
A&#34;触摸手势&#34;当用户将一个或多个手指放在触摸屏上,并且您的应用程序解释该模式时,就会发生这种情况 触动作为一种特定的姿势。相应地有两个阶段 手势检测:
- 收集有关触摸事件的数据。
- 解释数据,看它是否符合您的应用支持的任何手势的条件。
https://developer.android.com/training/gestures/movement.html#velocity:
每当当前触摸接触位置,压力或大小发生变化时,都会通过ACTION_MOVE事件触发新的onTouchEvent()。如检测常见手势中所述,所有这些事件都记录在onTouchEvent()的MotionEvent参数中。