Android怎么实现可随意拖动的View效果
发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,本篇内容主要讲解"Android怎么实现可随意拖动的View效果",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Android怎么实现可随意拖动的View效
千家信息网最后更新 2024年11月17日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安全错误
数据库的锁怎样保障安全
新服务器防护软件
南通中驰互联网科技有限公司
数据批量生成凭证 数据库
娱乐购物数据库
湖南郴州安卓软件开发待遇
apnetwork服务器代码苹果
管理口安装服务器
timing软件开发背景
郑州乐天堂软件开发
dede带数据库
网络安全防御机制
福泉游戏软件开发
广州聚交网络技术有限公司
美国银行网络安全攻击防范
黄冈创新软件开发铸造辉煌
绵阳览众网络技术有限公司
联想服务器安装双处理器
中国医学数据库
数据库技术的基础论文
软件开发 保密资质证书
共享网络文明共筑网络安全视频
办公软件开发价格表
简化软件开发
软件开发学年论文的题目
网络安全宣传周获奖简报
戴尔服务器ip不能访问
建站之星 服务器
卫生网络安全讲话
某公司数据库管理现状
奥特曼集结为什么没有服务器