如何在android中使用OnClick、OnLongClick和OnTouch在同一视图上



我正在开发安卓应用程序,需要在同一个视图上实现OnClickOnLongClickOnTouch,然后搜索了很多,最后得到了我与您分享的结果。

您必须将以下侦听器添加到所需的视图中

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;
}
});
}
}

最新更新