触碰并拖动到按钮区域之外并产生振动

问题描述

我创建了这种数字键盘,可以使用它而无需使用OnTouchListener函数从屏幕上抬起手指,并且在输入每个按钮时实现了振动。但是,我有两个问题:退出一个按钮时出现振动,而不是在屏幕的白色部分中进入另一个按钮。第二个问题是在退出并重新进入按钮时实现振动。有人可以帮我吗?

MainActivity

public class MainActivity extends AppCompatActivity {

MyButton  b1,b2,b3,b4,b5,b6,b7,b8,b9;
TextView number;
RelativeLayout relativeLayout;
long[] pattern = {0,200};
long[] pattern1 = {0,100,50,100};
private Button mLastButton;
private final static int[] STATE_pressed = {android.R.attr.state_pressed,android.R.attr.state_focused | android.R.attr.state_enabled };
private static int defaultStates[];
MotionEvent evento;
private Rect rect;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b1 = findViewById(R.id.n1);
    b2 = findViewById(R.id.n2);
    b3 = findViewById(R.id.n3);
    b4 = findViewById(R.id.n4);
    b5 = findViewById(R.id.n5);
    b6 = findViewById(R.id.n6);
    b7 = findViewById(R.id.n7);
    b8 = findViewById(R.id.n8);
    b9 = findViewById(R.id.n9);
    number = findViewById(R.id.editTextPhone);
    relativeLayout = findViewById(R.id.relativelayout);
    defaultStates = b1.getBackground().getState();

    relativeLayout.setonTouchListener(new View.OnTouchListener() {

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

            int x = (int) event.getX();
            int y = (int) event.getY();

            for (int i = 0; i < relativeLayout.getChildCount(); i++) {
                View current = relativeLayout.getChildAt(i);
                if (current instanceof Button) {
                    Button b = (Button) current;

                    if (!isPointWithin(x,y,b.getLeft(),b.getRight(),b.getTop(),b.getBottom())) {
                        b.getBackground().setState(defaultStates);

                    }

                    if (isPointWithin(x,b.getBottom())) {
                        b.getBackground().setState(STATE_pressed);
                        /*
                        if(b == mLastButton){
                            //mettere una sola vibrazione

                        }

                         */
                        if (b != mLastButton) {
                            if(b==b5){
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern1,-1);
                            }else {
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern,-1);
                            }
                            mLastButton = b;
                        }
                        if(event.getAction()==MotionEvent.ACTION_UP){
                            CharSequence Prec = number.getText();
                            if(b==b1){
                                number.setText(Prec+"1");
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern,-1);
                            }else if(b==b2){
                                number.setText(Prec+"2");
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern,-1);
                            }else if(b==b3){
                                number.setText(Prec+"3");
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern,-1);
                            }else if(b==b4){
                                number.setText(Prec+"4");
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern,-1);
                            }else if(b==b5){
                                number.setText(Prec+"5");
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern1,-1);
                            }else if(b==b6){
                                number.setText(Prec+"6");
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern,-1);
                            }else if(b==b7){
                                number.setText(Prec+"7");
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern,-1);
                            }else if(b==b8){
                                number.setText(Prec+"8");
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern,-1);
                            }else if(b==b9){
                                number.setText(Prec+"9");
                                Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                                vibrator.vibrate(pattern,-1);
                            }
                        }
                    }
                }
            }
            return true;
        }

    });

}
static boolean isPointWithin(int x,int y,int x1,int x2,int y1,int y2) {
    return (x <= x2 && x >= x1 && y <= y2 && y >= y1);
}}

布局XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/relativelayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
    android:id="@+id/editTextPhone"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_alignParentEnd="true"
    android:layout_marginStart="20dp"
    android:layout_marginTop="20dp"
    android:layout_marginEnd="20dp"
    android:ems="10"
    android:maxLength="20"
    android:textSize="24sp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<MyButton
    android:id="@+id/n1"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginStart="20dp"
    android:layout_marginTop="116dp"
    android:focusable="true"
    android:text="1" />

<MyButton
    android:id="@+id/n2"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_alignParentTop="true"
    android:layout_marginTop="116dp"
    android:layout_toEndOf="@+id/n1"
    android:text="2" />

<MyButton
    android:id="@+id/n3"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_alignParentTop="true"
    android:layout_marginTop="116dp"
    android:layout_toEndOf="@+id/n2"
    android:text="3" />

<MyButton
    android:id="@+id/n4"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_below="@+id/n1"
    android:layout_alignParentStart="true"
    android:layout_marginStart="20dp"
    android:text="4" />

<MyButton
    android:id="@+id/n5"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_below="@+id/n2"
    android:layout_toEndOf="@+id/n4"
    android:text="5" />

<MyButton
    android:id="@+id/n6"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_below="@+id/n3"
    android:layout_toEndOf="@+id/n5"
    android:text="6" />

<MyButton
    android:id="@+id/n7"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_below="@+id/n4"
    android:layout_alignParentStart="true"
    android:layout_marginStart="20dp"
    android:text="7" />

<MyButton
    android:id="@+id/n8"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_below="@+id/n5"
    android:layout_toEndOf="@+id/n7"
    android:text="8" />

<MyButton
    android:id="@+id/n9"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_below="@+id/n6"
    android:layout_toEndOf="@+id/n8"
    android:text="9" />

MyButton

public class MyButton extends Button {

public MyButton(Context context,AttributeSet attrs,int defStyle) {
    super(context,attrs,defStyle);
    // Todo Auto-generated constructor stub
}

public MyButton(Context context,AttributeSet attrs) {
    super(context,attrs);
    // Todo Auto-generated constructor stub
}

public MyButton(Context context) {
    super(context);
    // // Todo Auto-generated constructor stub
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // Todo Auto-generated method stub
    // return super.onTouchEvent(event);
    return false;
}}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)