45.实现自定义View拖拽效果的5种方法
来源:互联网 发布:星你同人之我知你不知 编辑:程序博客网 时间:2024/06/18 05:17
转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/52241694
本文出自:猴菇先生的博客
public class DragView extends View { private int mLastX; private int mLastY; public DragView(Context context) { super(context); init(); } public DragView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DragView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(); mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(Color.RED); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //计算宽高 setMeasuredDimension(measureDimension(widthMeasureSpec), measureDimension(heightMeasureSpec)); } private int measureDimension(int measureSpec) { int result = 0; //获得测量模式和大小 int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { result = specSize; } else { result = 200;//给一个默认值 if (specMode == MeasureSpec.AT_MOST) { result = Math.min(result, specSize); } } return result; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //画一个圆 canvas.drawCircle(getWidth() / 2, getHeight() / 2, Math.min(getWidth() / 2, getHeight() / 2), mPaint); @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //记录手指按下时的坐标 mLastX = x; mLastY = y; break; case MotionEvent.ACTION_MOVE: //计算偏移量 int offsetX = x - mLastX; int offsetY = y - mLastY; //重新计算、绘制布局位置 //方法1. layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY); //以下方法和layout()方法效果一样 //方法2.// offsetLeftAndRight(offsetX);// offsetTopAndBottom(offsetY); //方法3.// LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams();// params.leftMargin = getLeft() + offsetX;// params.topMargin = getTop() + offsetY;// setLayoutParams(params); //方法4.// ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) getLayoutParams();// params.leftMargin = getLeft() + offsetX;// params.topMargin = getTop() + offsetY;// setLayoutParams(params); //方法5.// ((View) getParent()).scrollBy(-offsetX, -offsetY); break; } return true; }}
1 0
- 45.实现自定义View拖拽效果的5种方法
- 自定义view实现图文环绕的效果
- 自定义view实现水波荡漾的效果
- android自定义view实现progressbar的效果
- 自定义view实现刮奖的效果
- 很酷炫的自定义view实现光圈效果
- 自定义view实现一个view的磁贴效果
- Android 自定义View:实现View的滑动效果
- Android 自定义View:实现View的滑动效果
- OnTouchEvent方法实现View的拖动效果
- 自定义View实现刮刮卡效果
- 自定义View实现SwichButton效果
- 自定义 View 实现钟表效果
- 自定义View实现索引效果
- 自定义view实现炸弹效果
- Android自定义View拖拽效果的设计
- 分析自定义view的实现过程-实现雪花飞舞效果
- Android自定义View的实现方法
- HDU 1599:find the mincost route(floyd最短路成环)
- 分析Redis架构设计
- hibernate的使用注意点
- 文章标题 codeforces 115A:Party ( 并查集)
- WebService之WADL和WSDL ING
- 45.实现自定义View拖拽效果的5种方法
- zookeeper作用
- netty学习02-几个核心类以及其介绍
- android的Lambda
- iOS开发 UI高级之CoreData
- 简单工厂模式
- Java中的多线程编程wait() join() notify() sleep() 等几篇文章待整理
- csu 1597 薛XX后代的IQ(循环节)
- 制作条形码