Android怎么实现可随意拖动的View效果
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,本篇内容主要讲解"Android怎么实现可随意拖动的View效果",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Android怎么实现可随意拖动的View效
千家信息网最后更新 2025年01月21日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安全错误
数据库的锁怎样保障安全
pubg低配版服务器错误
hp服务器监控
sql数据库跨年查询
网络技术迭代
学习如何防范网络安全风险
中医药数据库市场
基于构件的软件开发基本流程
谷歌cn服务器
学校网络安全信息科设置
贵阳酒店软件开发价格
php用什么数据库
青岛专业软件开发中心
电脑上的网络安全密匙是什么
学java后学什么数据库好
福建服务器回收公司云主机
什么叫做网络安全密钥手机
戴尔r620服务器回收
政府吸引 网络技术人才缺乏
宁夏机架式服务器价格
软件开发如何绑定端口
河南飞普网络技术有限公司简介
海康管理终端服务器
数据库表如何变宽
玩原神为什么一直重新连接服务器
我的世界服务器组队怎么聊天
软件开发评中级职称
王牌战争选哪个服务器发育最快
重庆邮电大学网络安全专业学什么
mt4添加模拟服务器
小学四则运算数据库