Android怎么实现可随意拖动的View效果
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"Android怎么实现可随意拖动的View效果",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Android怎么实现可随意拖动的View效
千家信息网最后更新 2026年11月03日Android怎么实现可随意拖动的View效果
本篇内容主要讲解"Android怎么实现可随意拖动的View效果",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Android怎么实现可随意拖动的View效果"吧!
自定义随意拖动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;/** *随意拖动的view */@SuppressLint("AppCompatCustomView")public class DragView extends ImageView { private int width; private int height; private int screenWidth; private int screenHeight; private Context context; //是否拖动 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 float yDistance = event.getY() - downY; int l,r,t,b; //当水平或者垂直滑动距离大于10,才算拖动事件 if (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(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; }}用到的工具类:
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) { return statusHeight; } 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) { return getScreenHeight(context) > getScreenWidth(context) ? getScreenWidth(context) : getScreenHeight(context); } /** * 根据指定k的系数获取屏幕在max范围内的最大长宽,默认宽比较小 * * @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); } /** * 将sp值转换为px值,保证文字大小不变 * * @param context * @param spValue * (DisplayMetrics类中属性scaledDensity) * @return */ public static int sp2px(Context context, float spValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * 获取屏幕中控件顶部位置的高度--即控件顶部的Y点 * * @return */ public static int getScreenViewTopHeight(View view) { return view.getTop(); } /** * 获取屏幕中控件底部位置的高度--即控件底部的Y点 * * @return */ public static int getScreenViewBottomHeight(View view) { return view.getBottom(); } /** * 获取屏幕中控件左侧的位置--即控件左侧的X点 * * @return */ public static int getScreenViewLeftHeight(View view) { return view.getLeft(); } /** * 获取屏幕中控件右侧的位置--即控件右侧的X点 * * @return */ public static int getScreenViewRightHeight(View view) { return view.getRight(); } /* * 获取控件宽 */ 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()); } /* * 获取控件高 */ 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()); }}XML文件:
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, "响应点击", Toast.LENGTH_SHORT).show(); } } }); }}
到此,相信大家对"Android怎么实现可随意拖动的View效果"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
控件
位置
屏幕
效果
内容
右侧
实际
底部
手机
顶部
项目
高度
学习
实用
更深
最大
事件
像素
兴趣
分辨率
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
北京路客互联网科技有限公司
科技互联网技术
互联网科技金融
互联网科技公司发展
美国互联网科技
嘟嘟瓜互联网科技
贷财互联网科技
狮子座互联网科技培训
云创客互联网科技公司
全球顶尖互联网科技公司
世界互联网科技公司市值排名
中国航天科技大学国际工业互联网
深圳市罗太互联网科技有限公司
南通创西澳互联网科技有限公司
深圳无忧互联网科技
城市宝互联网科技有限公司
郑州欣桑互联网科技有限公司
保山互联网科技靠谱吗
互联网科技的前景
北京瑞云互联网科技有限公司
互联网与科技
互联网科技有限公司图片
互联网科技战争
科技创新互联网企业
美国互联网黑科技
哈尔滨新华互联网科技
衡水科技产业互联网平台
华脉科技工业互联网产品
承德科技产业互联网发展
互联网科技包装股份有限公司上市