我想在Activity.onTouchEvent()
方法中做一些B.logic。它适用于TextView
和其他不可点击的视图。但是,点击Button
时不会被调用。但我也需要它。
这是代码。
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Oh shit!! click performed... :(", Toast.LENGTH_LONG).show();
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d(TAG, "ssssssssssssssssssssssss:touch");
return super.onTouchEvent(event);
}
public boolean dispatchTouchEvent(MotionEvent event) {
int eventaction=event.getAction();
switch(eventaction) {
case MotionEvent.ACTION_MOVE:
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
}
请帮我解决一下。
答案 0 :(得分:16)
我已根据需要使用了dispatchTouchEvent(MotionEvent ev)。这是解决方案。
private boolean isInSideClicked = false;
public boolean dispatchTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
View content = findViewById(R.id.textView1);
int[] contentLocation = new int[2];
content.getLocationOnScreen(contentLocation);
Rect rect = new Rect(contentLocation[0],
contentLocation[1],
contentLocation[0] + content.getWidth(),
contentLocation[1] + content.getHeight());
View frame = findViewById(R.id.editText1);
int[] frameLocation = new int[2];
frame.getLocationOnScreen(frameLocation);
Rect framerect = new Rect(frameLocation[0],
frameLocation[1],
frameLocation[0] + frame.getWidth(),
frameLocation[1] + frame.getHeight());
Log.d(TAG, "rect: "+rect.bottom+" , "+rect.top+" , "+rect.left+" , "+rect.right);
Log.d(TAG, "FrameRect: "+framerect.bottom+" , "+framerect.top+" , "+framerect.left+" , "+framerect.right);
Log.d(TAG, "x: "+event.getX()+" y: "+event.getY());
if((rect.contains((int)event.getX(), (int)event.getY()) || framerect.contains((int)event.getX(), (int)event.getY()) ) ) {
isInSideClicked = true;
}
if(isInSideClicked){
return super.dispatchTouchEvent(event);
}else{
return true;
}
}else if(event.getAction() == MotionEvent.ACTION_UP && isInSideClicked) {
isInSideClicked = false;
return super.dispatchTouchEvent(event);
}else if(event.getAction() == MotionEvent.ACTION_MOVE && isInSideClicked) {
return super.dispatchTouchEvent(event);
}else{
isInSideClicked = false;
return true;
}
}
以下是OS级别如何处理触摸事件的层次结构。
Activity.dispatchTouchEvent()
ViewGroup.dispatchTouchEvent()
View.dispatchTouchEvent()
View.onTouchEvent()
ViewGroup.onTouchEvent()
Activity.onTouchEvent()
有了这个,我限制了不在所需布局/视图中的视图的触摸事件。
答案 1 :(得分:1)
您已为按钮注册touchListener。您只为按钮实现了clickListener。要调用onTouchEvent()for按钮,必须将按钮注册为:button.setOnTouchListener(this);
答案 2 :(得分:0)
Please add below given 2 line in your xml hope it will help you its working fine for me.
**android:focusable="false"
android:focusableInTouchMode="false"**
<Button
android:id="@+id/button2"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_below="@+id/button1"
android:layout_marginTop="3dp"
android:background="#FFFFFF"
android:focusable="false"
android:focusableInTouchMode="false"
android:text="Delete"
android:textColor="#0099CC" />
答案 3 :(得分:0)
请在onCreate方法中添加以下代码。
在这里你可以下来,移动或上升Button的事件。
在按钮启动事件调用时写下您的逻辑。
findViewById(R.id.btn).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(Main.this,
"Oh shit!! click down performed... :(",
Toast.LENGTH_LONG).show();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
Toast.makeText(Main.this,
"Oh shit!! click up performed... :(",
Toast.LENGTH_LONG).show();
break;
default:
break;
}
return true;
}
});
答案 4 :(得分:0)
我遇到了同样的问题。这很容易解决,而不会删除你的:
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d(TAG, "ssssssssssssssssssssssss:touch");
return super.onTouchEvent(event);
};
添加按钮:
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//YOUR CODE HERE
if(v==button){
//Your button has been pressed
}
else {
//Other View element has been pressed
}
}
}