多次触摸单个按钮 android
Multiple touches on a single button android
我有一个带按钮的应用程序,我正在尝试处理多点触控事件。目前我正在使用触摸方法并寻找 MotionEven.ACTION_DOWN
和 MotionEven.ACTION_UP
来跟踪触摸事件。如果同时触摸两个按钮,这会很好地工作。但是,我想让按钮在用一根手指触摸时有一种行为,而在用更多手指触摸时有不同的行为。例如,如果您用一根手指触摸按钮,按钮会变成红色,如果您用两根手指触摸按钮,按钮会变成黄色,如果您用三根手指触摸按钮,按钮会变成绿色,依此类推。
我 运行 遇到的问题是,当我用一根以上的手指触摸按钮时,第二次触摸似乎不会触发事件。如何检测同一按钮上的多次触摸?
这是你想要的基础。它可能不完全是你想要的,因为我以前被识别的 MotionEvent
手指之间必须有一些 space。如果 2 个手指并拢,它会给出 ACTION_MOVE
作为 MotionEvent
。如果您确实需要,您也许能够解读这些并确定是否有 2 根或更多手指并拢在一起。 MotionEvent
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final int MAX_TOUCHES = 3;
private View buttonView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
buttonView = findViewById(R.id.button_view);
buttonView.setOnTouchListener(new View.OnTouchListener() {
boolean eventConsumed = false;
// Only handling these 4 events means that there must be some space
// between fingers when touching
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Log.d(TAG, "" + motionEvent.toString());
switch (motionEvent.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
setButtonColor(motionEvent.getPointerCount());
eventConsumed = true;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
// subtract 1 from the count, this event still includes the touch just removed
setButtonColor(motionEvent.getPointerCount() - 1);
eventConsumed = true;
break;
default:
break;
}
return eventConsumed;
}
});
}
private void setButtonColor(int count) {
Log.d(TAG, "count = " + count);
if(count < 0) {
count = 0;
} else if(count > MAX_TOUCHES) {
count = MAX_TOUCHES;
}
switch (count) {
case 0:
buttonView.setBackgroundColor(getButtonColor(R.color.colorNotPressed));
break;
case 1:
buttonView.setBackgroundColor(getButtonColor(R.color.colorRed));
break;
case 2:
buttonView.setBackgroundColor(getButtonColor(R.color.colorYellow));
break;
case 3:
buttonView.setBackgroundColor(getButtonColor(R.color.colorGreen));
break;
default:
break;
}
}
// This keeps you from getting a warning about getResources().getColor() being deprecated
@SuppressWarnings(value = "deprecation")
private int getButtonColor(int id) {
int color;
if(Build.VERSION.SDK_INT >= 23) {
color = getColor(id);
} else {
color = getResources().getColor(id);
}
return color;
}
}
activity_main.xml(不包括 AppBar 或 FAB 的东西)
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
>
<View
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_centerInParent="true"
android:text="Big Button"
android:background="@color/colorNotPressed"
android:id="@+id/button_view"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Big Button"
android:textSize="20sp"
/>
</RelativeLayout>
在您的 colors.xml 文件中使用这些
<color name="colorNotPressed">#606060</color>
<color name="colorRed">#FF0000</color>
<color name="colorYellow">#FFFF00</color>
<color name="colorGreen">#00FF00</color>
我有一个带按钮的应用程序,我正在尝试处理多点触控事件。目前我正在使用触摸方法并寻找 MotionEven.ACTION_DOWN
和 MotionEven.ACTION_UP
来跟踪触摸事件。如果同时触摸两个按钮,这会很好地工作。但是,我想让按钮在用一根手指触摸时有一种行为,而在用更多手指触摸时有不同的行为。例如,如果您用一根手指触摸按钮,按钮会变成红色,如果您用两根手指触摸按钮,按钮会变成黄色,如果您用三根手指触摸按钮,按钮会变成绿色,依此类推。
我 运行 遇到的问题是,当我用一根以上的手指触摸按钮时,第二次触摸似乎不会触发事件。如何检测同一按钮上的多次触摸?
这是你想要的基础。它可能不完全是你想要的,因为我以前被识别的 MotionEvent
手指之间必须有一些 space。如果 2 个手指并拢,它会给出 ACTION_MOVE
作为 MotionEvent
。如果您确实需要,您也许能够解读这些并确定是否有 2 根或更多手指并拢在一起。 MotionEvent
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final int MAX_TOUCHES = 3;
private View buttonView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
buttonView = findViewById(R.id.button_view);
buttonView.setOnTouchListener(new View.OnTouchListener() {
boolean eventConsumed = false;
// Only handling these 4 events means that there must be some space
// between fingers when touching
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Log.d(TAG, "" + motionEvent.toString());
switch (motionEvent.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
setButtonColor(motionEvent.getPointerCount());
eventConsumed = true;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
// subtract 1 from the count, this event still includes the touch just removed
setButtonColor(motionEvent.getPointerCount() - 1);
eventConsumed = true;
break;
default:
break;
}
return eventConsumed;
}
});
}
private void setButtonColor(int count) {
Log.d(TAG, "count = " + count);
if(count < 0) {
count = 0;
} else if(count > MAX_TOUCHES) {
count = MAX_TOUCHES;
}
switch (count) {
case 0:
buttonView.setBackgroundColor(getButtonColor(R.color.colorNotPressed));
break;
case 1:
buttonView.setBackgroundColor(getButtonColor(R.color.colorRed));
break;
case 2:
buttonView.setBackgroundColor(getButtonColor(R.color.colorYellow));
break;
case 3:
buttonView.setBackgroundColor(getButtonColor(R.color.colorGreen));
break;
default:
break;
}
}
// This keeps you from getting a warning about getResources().getColor() being deprecated
@SuppressWarnings(value = "deprecation")
private int getButtonColor(int id) {
int color;
if(Build.VERSION.SDK_INT >= 23) {
color = getColor(id);
} else {
color = getResources().getColor(id);
}
return color;
}
}
activity_main.xml(不包括 AppBar 或 FAB 的东西)
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
>
<View
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_centerInParent="true"
android:text="Big Button"
android:background="@color/colorNotPressed"
android:id="@+id/button_view"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Big Button"
android:textSize="20sp"
/>
</RelativeLayout>
在您的 colors.xml 文件中使用这些
<color name="colorNotPressed">#606060</color>
<color name="colorRed">#FF0000</color>
<color name="colorYellow">#FFFF00</color>
<color name="colorGreen">#00FF00</color>