我正在制作一个类似snapchat相机按钮的按钮,可以选择点击或按住/松开。
单击-打印tap
按住-按住和在发布时打印-发布
点击工作完美,但ontouch永远不会被调用。我真的需要这方面的帮助,谢谢。
下面是我的代码:
public class MainActivity extends Activity implements View.OnTouchListener {
private Button TouchMe;
private GestureDetector gesture;
private boolean isSpeakButtonLongPressed = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TouchMe = (Button) findViewById(R.id.button);
gesture = new GestureDetector(this,new Gesture());
TouchMe.setOnTouchListener(this);
}
class Gesture extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener{
private boolean mIsLongpressEnabled = false;
public boolean onSingleTapUp(MotionEvent ev) {
Toast.makeText(MainActivity.this, "Tap", Toast.LENGTH_SHORT).show();
return true;
}
public void onLongPress(MotionEvent ev) {
}
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
}
@Override
public boolean onDown (MotionEvent event) {
return false;
}
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
return false; // Right to left
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
return false; // Left to right
}
if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
return false;
} else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
return false; // Top to bottom
}
return false;
}
public void setIsLongpressEnabled(boolean isLongpressEnabled) {
mIsLongpressEnabled = isLongpressEnabled;
}
public boolean isLongpressEnabled() {
return mIsLongpressEnabled;
}
public boolean onTouchEvent (MotionEvent ev){
if(ev.getAction() == MotionEvent.ACTION_DOWN){
handel.postDelayed(run, 2000);
return true;
}else if(ev.getAction() == MotionEvent.ACTION_UP){
handel.removeCallbacks(run);
Toast.makeText(MainActivity.this, "release!", Toast.LENGTH_LONG).show();
return true;
};
return true;
}
Handler handel = new Handler();
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
handel.postDelayed(run, 2000);
return true;
}else if(motionEvent.getAction() == MotionEvent.ACTION_UP){
handel.removeCallbacks(run);
Toast.makeText(MainActivity.this, "release!", Toast.LENGTH_LONG).show();
return true;
};
return gesture.onTouchEvent(motionEvent);
}
}
Runnable run = new Runnable() {
@Override
public void run() {
// Your code to run on long click
Toast.makeText(MainActivity.this, "hold", Toast.LENGTH_LONG).show();
}
};
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
gesture.onTouchEvent(motionEvent);
return true;
}
}发布于 2015-03-28 18:21:54
如果您从onDown()返回false,系统会假定您希望忽略该手势的其余部分,并且GestureDetector.OnGestureListener的其他方法永远不会被调用。这可能会在您的应用程序中导致意想不到的问题。只有当你真的想忽略整个手势时,你才应该从onDown()返回false。
实际上,我建议你为你的按钮创建一个子类,在那里你可以覆盖dispatchTouchEvent和onTouchEvent并处理你的手势。它将允许简化您的activity类并重用组件。此外,为onTapHold、onTapRelease等操作创建回调接口也是一个好主意。
希望你能解决这个问题!
https://stackoverflow.com/questions/29315169
复制相似问题