如何解决如何在android中的同一视图上使用OnClick、OnLongClick和OnTouch?
我正在开发 android 应用程序,其中需要在同一视图上实现 OnClick
、OnLongClick
和 OnTouch
,然后搜索了很多,最后得到了我与您分享的结果举个例子。
解决方法
您必须将以下侦听器添加到所需的视图中。
yourview.setOnClickListener(new FrameLayout.OnClickListener() {
@Override
public void onClick(View v) {
parentCardLayout_OnClick();
}
});
yourview.setLongClickable(true);
yourview.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
showCameraSettingDialog();
return false;
}
});
使用函数启用如下所示的视图拖动。
viewDragUtil.makeDraggable(parentCardLayout,Draggable.STICKY.NONE,false,this);
viewDragUtil.isDragEnabled = true;
以下代码用于 OnTouchListener
视图,因此我已将其放在单独的类中。
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import static android.content.ContentValues.TAG;
public class DraggableUtils {
//Draggable view code
float widgetInitialX = 0f;
float widgetDX = 0f;
float widgetInitialY = 0f;
float widgetDY = 0f;
public static boolean isDragEnabled = true;
/**
* VARIABLE USED IN ON CLICK CUSTOM LOGIC
*/
private float initialTouchX;
private float initialTouchY;
public boolean goneFlag = false;
public void makeDraggable(View view,Draggable.STICKY stickyAxis,boolean animated,DraggableListener mDraggableListener) {
view.setOnTouchListener(new View.OnTouchListener() {
final Handler handler = new Handler();
Runnable mLongPressed = new Runnable() {
public void run() {
goneFlag = true;
//Code for long click
Log.e("TAG","run: LOOOOOOO");
view.performLongClick();
}
};
@Override
public boolean onTouch(View v,MotionEvent event) {
if (isDragEnabled) {
View viewParent = (View) v.getParent();
float parentHeight = viewParent.getHeight();
float parentWidth = viewParent.getWidth();
float xMax = parentWidth - v.getWidth();
float xMiddle = parentWidth / 2;
float yMax = parentHeight - v.getHeight();
float yMiddle = parentHeight / 2;
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
goneFlag = false;
widgetDX = v.getX() - event.getRawX();
widgetDY = v.getY() - event.getRawY();
widgetInitialX = v.getX();
widgetInitialY = v.getY();
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
handler.postDelayed(mLongPressed,500);
break;
case MotionEvent.ACTION_MOVE:
int Xdiff = (int) (event.getRawX() - initialTouchX);
int Ydiff = (int) (event.getRawY() - initialTouchY);
Log.e(TAG,"onTouch: initialTouchX " + initialTouchX);
Log.e(TAG,"onTouch: Xdiff " + Xdiff);
Log.e(TAG,"onTouch: event.getRawX() " + event.getRawX());
if (!(Math.abs(Xdiff) < 10 && Math.abs(Ydiff) < 10)) {
float newX = event.getRawX() + widgetDX;
newX = Math.max(0F,newX);
newX = Math.min(xMax,newX);
v.setX(newX);
float newY = event.getRawY() + widgetDY;
newY = Math.max(0F,newY);
newY = Math.min(yMax,newY);
v.setY(newY);
mDraggableListener.onPositionChanged(v);
//
goneFlag = false;
Log.e("TAG","onTouch: Else");
handler.removeCallbacks(mLongPressed);
}
break;
case MotionEvent.ACTION_UP:
handler.removeCallbacks(mLongPressed);
int Xdiff1 = (int) (event.getRawX() - initialTouchX);
int Ydiff1 = (int) (event.getRawY() - initialTouchY);
if ((Math.abs(Xdiff1) < 10 && Math.abs(Ydiff1) < 10) && !goneFlag) {
v.performClick();
}
break;
default:
return false;
}
return true;
}
return false;
}
});
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。