Android实现跟随手指拖动并自动贴边的View样式(实例demo)

效果图

代码

/** * 根据手指拖动的当前位置,自动贴边的View */ public class DragView extends ImageView implements View.OnTouchListener{ private int screenWidth; private int screenHeight; private Context mContext; private int lastX, lastY; private int left ,top; private ViewGroup.MarginLayoutParams layoutParams; private int startX; private int endX; private boolean isMoved = false; private onDragViewClickListener mLister; public interface onDragViewClickListener{ void onDragViewClick(); } public void setOnDragViewClickListener(onDragViewClickListener listener){ this.mLister = listener; } public DragView(Context context) { this(context,null); } public DragView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); screenWidth = displayMetrics.widthPixels; screenHeight = displayMetrics.heightPixels-getStatusBarHeight(); init(); } public void init(){ setOnTouchListener(this); post(new Runnable() { @Override public void run() { layoutParams = (ViewGroup.MarginLayoutParams)getLayoutParams(); layoutParams.topMargin = screenHeight - getHeight(); layoutParams.leftMargin = screenWidth - getWidth(); setLayoutParams(layoutParams); } }); } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); startX = lastX; break; case MotionEvent.ACTION_MOVE: isMoved = true; int dx = (int) event.getRawX() - lastX; int dy = (int) event.getRawY() - lastY; left = v.getLeft() + dx; top = v.getTop() + dy; int right = v.getRight() + dx; int bottom = v.getBottom() + dy; // 设置不能出界 if (left < 0) { left = 0; right = left + v.getWidth(); } if (right > screenWidth) { right = screenWidth; left = right - v.getWidth(); } if (top < 0) { top = 0; bottom = top + v.getHeight(); } if (bottom > screenHeight) { bottom = screenHeight; top = bottom - v.getHeight(); } v.layout(left, top, right, bottom ); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_UP: //只有滑动改变上边距时,抬起才进行设置 if (isMoved) { layoutParams = (ViewGroup.MarginLayoutParams)getLayoutParams(); layoutParams.topMargin = top; setLayoutParams(layoutParams); } endX = (int) event.getRawX(); //滑动距离比较小,当作点击事件处理 if (Math.abs(startX - endX) < 6) { return false; } if (left +v.getWidth()/2 < screenWidth/2) { startScroll(left,screenWidth/2,true); } else { startScroll(left,screenWidth/2,false); } break; } return true; } //在此处理点击事件 @Override public boolean onTouchEvent(MotionEvent event) { mLister.onDragViewClick(); return super.onTouchEvent(event); } public void startScroll(final int start, int end, final boolean isLeft){ ValueAnimator valueAnimator = ValueAnimator.ofFloat(start,end).setDuration(800); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { if (isLeft) { layoutParams.leftMargin = (int) (start*(1-animation.getAnimatedFraction())); } else { layoutParams.leftMargin = (int) (start + (screenWidth - start - getWidth())*(animation.getAnimatedFraction())); } setLayoutParams(layoutParams); } }); valueAnimator.start(); } /** * 获取状态栏的高度 * @return 状态栏高度 */ public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } }

以上所述是小编给大家介绍的Android实现跟随手指拖动并自动贴边的View样式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-09-18 08:57:29

Android实现跟随手指拖动并自动贴边的View样式(实例demo)的相关文章

Android自定义View圆形和拖动圆、跟随手指拖动效果

单纯的自定义一个圆非常简单 只需要几步就完成 拖动圆添加实现触摸事件即可 我在第一次自定义View圆遇到的几个Bug: 1.拖动圆的话在xml里面设置的自定义圆的宽和高是它能活动的空间的大小 不是圆控件的大小 如果你定义了100dp 拖动它的时候超过100dp这个距离这个圆就会看不见 就像下面这样 如果想活动于整个屏幕直接给宽和高match_parent属性就好了 2.我在定义充满属性match_parent的时候运行会报错,什么方法都用了就是不行,耐心等待过一会就好了-有可能是studio没来

Android自定义View圆形和拖动圆跟随手指拖动

单纯的自定义一个圆非常简单 只需要几步就完成 拖动圆添加实现触摸事件即可 我在第一次自定义View圆遇到的小问题: 1.拖动圆的话在xml里面设置的自定义圆的宽和高是它能活动的空间的大小 不是圆控件的大小 如果你定义了100dp 拖动它的时候超过100dp这个距离这个圆就会看不见 就像下面这样 如果想活动于整个屏幕直接给宽和高match_parent属性就好了 2.在布局里自定的view会提示编译 点击Build编译一下就好了 下面开始写代码: 先是单纯的创建一个圆形 创建一个类继承View 实

Android编程实现图片的浏览、缩放、拖动和自动居中效果_Android

本文实例讲述了Android编程实现图片的浏览.缩放.拖动和自动居中效果的方法.分享给大家供大家参考,具体如下: Touch.java /** * 图片浏览.缩放.拖动.自动居中 */ public class Touch extends Activity implements OnTouchListener { Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); DisplayMetrics dm; ImageVie

android开发之图片的浏览、缩放、拖动和自动居中

  Touch.java  代码如下 复制代码 /**  * 图片浏览.缩放.拖动.自动居中  */ public class Touch extends Activity implements OnTouchListener {     Matrix matrix = new Matrix();     Matrix savedMatrix = new Matrix();     DisplayMetrics dm;     ImageView imgView;     Bitmap bitm

Android中View跟随手指移动效果

最近做了一个项目中,其中遇到这样的需求要求图片移动到手指触碰的地方.具体实现代码如下所示: package com.example.plane; import Android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.Display; import android.view.KeyEvent; import android.view.Menu; i

Android编程实现图标拖动效果的方法

  Android编程实现图标拖动效果的方法         本文实例讲述了Android编程实现图标拖动效果的方法.分享给大家供大家参考,具体如下: 最近优化图标拖动时的速率,稍微有一点点效果,直接把代码贴出来,有兴趣一起讨论的朋友可以给我留言. 代码如下: DragView.java package com.android.dragtest; import android.content.Context; import android.util.AttributeSet; import an

Android编程仿Iphone拖动相片特效Gallery的简单应用示例_Android

本文实例讲述了Android编程仿Iphone拖动相片特效Gallery的简单应用.分享给大家供大家参考,具体如下: Step 1:准备图片素材. 将icon2,icon3,icon4,icon5,icon6五张图片导入res/drawable里加上icon.png本身一共有6张图片. Step 2:新建Android工程,命名为GalleryDemo. Step 3:设计UI,修改main.xml代码如下: <?xml version="1.0" encoding="

Android编程实现图标拖动效果的方法_Android

本文实例讲述了Android编程实现图标拖动效果的方法.分享给大家供大家参考,具体如下: 最近优化图标拖动时的速率,稍微有一点点效果,直接把代码贴出来,有兴趣一起讨论的朋友可以给我留言. 代码如下: DragView.java package com.android.dragtest; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.

android 图库 多媒体-Android原生图库应用Gallery2不自动更新的问题

问题描述 Android原生图库应用Gallery2不自动更新的问题 当从手机浏览器上下载图片到手机上后,图库里面不会及时更新,而要等上好几分钟才会自动刷新,而其他图片APP如"快图"就能及时更新.其他情况,比如说通过小米手机自带的文件管理删除图片.把图片复制到sd卡上,图库也是不能立即更新的. 但是如果用RootExplorer来做复制/删除的话(手机已root),图库就能立即更新. Gallery2的代码看了一些,还是不明白原因,求高人指教.