在 android 中找出当用户按下按钮时将他的手指移到按钮外
find out when the user press a button the moves his finger outside of the button in android
假设我有一个 class 注册按钮:
public class SignUp extends AppCompatButton {
public SignUp(Context context) {
this(context, null);
}
public SignUp(Context context, AttributeSet attrs) {
super(context, attrs, android.support.v7.appcompat.R.attr.buttonStyle);
setFocusable(true);
setFocusableInTouchMode(true);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
requestFocus();
this.setBackgroundColor(getResources().getColor(R.color.darkGreen));
return true;
case MotionEvent.ACTION_UP:
this.setBackgroundColor(getResources().getColor(R.color.green));
performClick();
return true;
}
return false;
}
@Override
public boolean performClick() {
super.performClick();
return false;
//TODO
}
我的应用程序中有一个名为 signUp 的按钮,我在 XML 文件中这样声明了它:
<com.example.John.myapplication.SignUp
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="@string/sign_up"
android:background="@color/green"
android:textColor="@color/whiteText"
app:layout_constraintTop_toBottomOf="@+id/verify_password"
android:layout_marginTop="40dp"
app:layout_constraintLeft_toRightOf="parent"
app:layout_constraintRight_toLeftOf="parent"
android:id="@+id/sign_up"
android:textSize="20sp"
/>
现在,如果用户触摸注册按钮,按钮的颜色将为深绿色,而当他释放它时,按钮的颜色将再次变为绿色。但我想添加此功能,以便当用户触摸按钮然后将手指拖出按钮时,按钮颜色变为绿色但我不能。
MotionEvent.ACTION_OUTSIDE、MotionEvent.ACTION_CANCEL 和 ... 的 none 有效。
我该怎么办?
而且我不想通过协调来检查手指是否在按钮之外,因为当按钮是椭圆形时,这是一项巨大的工作。
这里不需要听众(而且Action.DOWN不拖拉),请仔细阅读本节,如果您需要更多指导,请告诉我 -> https://developer.android.com/guide/topics/resources/color-list-resource
这个 -> http://www.zoftino.com/android-color-state-list-example -> 似乎是一个很好的例子。
只需使用一个 selector
。
https://developer.android.com/guide/topics/resources/color-list-resource
例子
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@color/colorTextPrimaryDark" />
<item android:color="@color/colorAccent3" />
</selector>
您可以使用最新支持库中引入的最新 Material Button 组件。默认情况下,按钮的背景颜色是您的主题强调色。
试试这个
<android.support.design.button.MaterialButton
android:id="@+id/btn__next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
app:backgroundTint="@color/colorAccent" /* Change colour for background */
app:rippleColor="@color/colorAccent" /* Change colour for selecting button */
android:text="@string/next" />
使用view bounds比较触摸事件边界,特此分享修改后的代码
private Rect buttonBounds;
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
buttonBounds = new Rect(getLeft(), getTop(), getRight(), getBottom());
requestFocus();
this.setBackgroundColor(getResources().getColor(R.color.darkGreen));
return true;
case MotionEvent.ACTION_UP:
this.setBackgroundColor(getResources().getColor(R.color.green));
performClick();
return true;
case MotionEvent.ACTION_MOVE:
if(!buttonBounds.contains(getLeft() + (int) event.getX(), getTop() + (int) event.getY())){
// User moved outside bounds
this.setBackgroundColor(getResources().getColor(R.color.green));
return true;
}
}
return false;
}
假设我有一个 class 注册按钮:
public class SignUp extends AppCompatButton {
public SignUp(Context context) {
this(context, null);
}
public SignUp(Context context, AttributeSet attrs) {
super(context, attrs, android.support.v7.appcompat.R.attr.buttonStyle);
setFocusable(true);
setFocusableInTouchMode(true);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
requestFocus();
this.setBackgroundColor(getResources().getColor(R.color.darkGreen));
return true;
case MotionEvent.ACTION_UP:
this.setBackgroundColor(getResources().getColor(R.color.green));
performClick();
return true;
}
return false;
}
@Override
public boolean performClick() {
super.performClick();
return false;
//TODO
}
我的应用程序中有一个名为 signUp 的按钮,我在 XML 文件中这样声明了它:
<com.example.John.myapplication.SignUp
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="@string/sign_up"
android:background="@color/green"
android:textColor="@color/whiteText"
app:layout_constraintTop_toBottomOf="@+id/verify_password"
android:layout_marginTop="40dp"
app:layout_constraintLeft_toRightOf="parent"
app:layout_constraintRight_toLeftOf="parent"
android:id="@+id/sign_up"
android:textSize="20sp"
/>
现在,如果用户触摸注册按钮,按钮的颜色将为深绿色,而当他释放它时,按钮的颜色将再次变为绿色。但我想添加此功能,以便当用户触摸按钮然后将手指拖出按钮时,按钮颜色变为绿色但我不能。 MotionEvent.ACTION_OUTSIDE、MotionEvent.ACTION_CANCEL 和 ... 的 none 有效。 我该怎么办?
而且我不想通过协调来检查手指是否在按钮之外,因为当按钮是椭圆形时,这是一项巨大的工作。
这里不需要听众(而且Action.DOWN不拖拉),请仔细阅读本节,如果您需要更多指导,请告诉我 -> https://developer.android.com/guide/topics/resources/color-list-resource
这个 -> http://www.zoftino.com/android-color-state-list-example -> 似乎是一个很好的例子。
只需使用一个 selector
。
https://developer.android.com/guide/topics/resources/color-list-resource
例子
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@color/colorTextPrimaryDark" />
<item android:color="@color/colorAccent3" />
</selector>
您可以使用最新支持库中引入的最新 Material Button 组件。默认情况下,按钮的背景颜色是您的主题强调色。
试试这个
<android.support.design.button.MaterialButton
android:id="@+id/btn__next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
app:backgroundTint="@color/colorAccent" /* Change colour for background */
app:rippleColor="@color/colorAccent" /* Change colour for selecting button */
android:text="@string/next" />
使用view bounds比较触摸事件边界,特此分享修改后的代码
private Rect buttonBounds;
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
buttonBounds = new Rect(getLeft(), getTop(), getRight(), getBottom());
requestFocus();
this.setBackgroundColor(getResources().getColor(R.color.darkGreen));
return true;
case MotionEvent.ACTION_UP:
this.setBackgroundColor(getResources().getColor(R.color.green));
performClick();
return true;
case MotionEvent.ACTION_MOVE:
if(!buttonBounds.contains(getLeft() + (int) event.getX(), getTop() + (int) event.getY())){
// User moved outside bounds
this.setBackgroundColor(getResources().getColor(R.color.green));
return true;
}
}
return false;
}