To achieve in the process of project can be arbitrary drag in the page, just begin to implement is implemented by means of suspension ball, because before the project used, found that every time the user after installation after implementation, has the limitation of rights, even some of the user closes the levitation ball after permission, don’t know how to open the floating ball permissions on mobile phones, so the user experience is very bad, So their own custom implementation drag in the page, do not need to request permission.
Custom drag View:
package com.dragdemo; import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.ImageView; /** * Drag view */ @suppresslint ("AppCompatCustomView") public class DragView extends ImageView { private int width; private int height; private int screenWidth; private int screenHeight; private Context context; // Drag private Boolean isDrag=false;
public boolean isDrag() {
return isDrag;
}
public DragView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width=getMeasuredWidth();
height=getMeasuredHeight();
screenWidth= ScreenUtil.getScreenWidth(context);
screenHeight=ScreenUtil.getScreenHeight(context)-getStatusBarHeight();
}
public int getStatusBarHeight(){
int resourceId = getResources().getIdentifier("status_bar_height"."dimen"."android");
return getResources().getDimensionPixelSize(resourceId);
}
private float downX;
private float downY;
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (this.isEnabled()) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isDrag=false;
downX = event.getX();
downY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
Log.e("kid"."ACTION_MOVE");
final float xDistance = event.getX() - downX;
final floatyDistance = event.getY() - downY; int l,r,t,b; // A drag event is considered when the horizontal or vertical slide distance is greater than 10if (Math.abs(xDistance) >10 ||Math.abs(yDistance)>10) {
Log.e("kid"."Drag");
isDrag=true; l = (int) (getLeft() + xDistance); r = l+width; t = (int) (getTop() + yDistance); b = t+height; // If it is a fixed area, the width and height of the parent control should be obtained before processingif(l<0){
l=0;
r=l+width;
}else if(r>screenWidth){
r=screenWidth;
l=r-width;
}
if(t<0){
t=0;
b=t+height;
}else if(b>screenHeight){
b=screenHeight;
t=b-height;
}
this.layout(l, t, r, b);
}
break;
case MotionEvent.ACTION_UP:
setPressed(false);
break;
case MotionEvent.ACTION_CANCEL:
setPressed(false);
break;
}
return true;
}
return false; }}Copy the code
Tool classes used:
package com.dragdemo;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
public class ScreenUtil {
private static int width = 0;
private static int height = 0;
private static int showHeight = 0;
private static int statusHeight = 0;
private static float density = 0;
public static int getScreenWidth(Context context) {
if (width == 0) {
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
width = display.getWidth();
}
return width;
}
public static int getScreenHeight(Context context) {
if (height == 0) {
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
height = display.getHeight();
}
return height;
}
public static int getScreenShowHeight(Context context) {
if (showHeight == 0) {
showHeight = getScreenHeight(context) - getStatusBarHeight(context);
}
return showHeight;
}
public static int getStatusBarHeight(Context context) {
if (statusHeight > 0) {
returnstatusHeight; } Class<? > c = null; Object obj = null; java.lang.reflect.Field field = null; int x = 0; try { c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
statusHeight = context.getResources().getDimensionPixelSize(x);
return statusHeight;
} catch (Throwable e) {
e.printStackTrace();
}
return statusHeight;
}
public static float getScreenDensity(Context context) {
if (density == 0) {
try {
DisplayMetrics dm = new DisplayMetrics();
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
manager.getDefaultDisplay().getMetrics(dm);
density = dm.density;
} catch (Exception ex) {
ex.printStackTrace();
density = 1.0f;
}
}
return density;
}
public static float getScreentMinLength(Context context) {
returngetScreenHeight(context) > getScreenWidth(context) ? getScreenWidth(context) : getScreenHeight(context); } /** * Gets the maximum length and width of the screen in the Max range based on the coefficient specified by k. The default width ratio is small ** @param context * @param k * @return
*/
public static DrawWrap getCutWrap(Context context, float k, float max) {
float tWidth = getScreenWidth(context);
float tHeight = getScreenHeight(context);
if (tWidth * max * k > tHeight) {
return new DrawWrap(tHeight * max / k, tHeight * max);
} else {
return new DrawWrap(tWidth * max, tWidth * max * k);
}
}
public static class DrawWrap {
public float width;
public float height;
public DrawWrap(float width, float height) {
this.width = width;
this.height = height;
}
}
public static int dip2px(Context context, float dipValue) {
return(int) (dipValue * getScreenDensity(context) + 0.5f); } /** * convert sp to PX with the same text size ** @param context * @param spValue * (scaledDensity) * @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return(int) (spValue * fontScale + 0.5f); } public static int px2dip(Context Context);} public static int px2dip(Context Context);float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return(int) (pxValue/scale + 0.5f); } /** * gets the height of the top position of the control on the screen -- the Y point ** @ at the top of the controlreturn
*/
public static int getScreenViewTopHeight(View view) {
returnview.getTop(); } /** * gets the height of the bottom position of the control on the screen -- the Y point ** @ at the bottom of the controlreturn
*/
public static int getScreenViewBottomHeight(View view) {
returnview.getBottom(); } /** * gets the position to the left of the control on the screen -- that is, the X point ** @ to the left of the controlreturn
*/
public static int getScreenViewLeftHeight(View view) {
returnview.getLeft(); } /** * gets the position on the screen to the right of the control -- the X dot ** @ on the right of the controlreturn
*/
public static int getScreenViewRightHeight(View view) {
returnview.getRight(); } / access controls wide * * * / public static int getWidth (View View) {int w = View. MeasureSpec. MakeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); view.measure(w, h);return(view.getMeasuredWidth()); } / access controls high * * * / public static int getHeight (View View) {int w = View. MeasureSpec. MakeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); view.measure(w, h);return(view.getMeasuredHeight()); }}Copy the code
The XML file:
<com.dragdemo.DragView
android:id="@+id/iv_drag"
android:layout_gravity="center"
android:src="@drawable/function_night_open"
android:layout_width="80dp"
android:layout_height="80dp"
/>
Copy the code
MainActivity:
package com.dragdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
DragView iv_drag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_drag= (DragView) findViewById(R.id.iv_drag);
iv_drag.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(! iv_drag.isDrag()){ Toast.makeText(MainActivity.this,"Response click", Toast.LENGTH_SHORT).show(); }}}); }}Copy the code
Project Demo link: at the bottom of the public account reply “drag View” can be obtained.
The following is our personal public account (LongXuanzhigu). Our articles will be synchronized to this account, which is convenient for exchanging and learning Android knowledge and sharing personal favorite articles: