Android-------自定义圆形图片实现多点触控
来源:互联网 发布:手机淘宝号怎么登录 编辑:程序博客网 时间:2024/05/02 00:07
详情见链接:http://www.cnblogs.com/gaoliangjie/p/5569671.html
public class MyView extends ImageView { private Paint p; static final int NONE = 0; static final int DRAG = 1; //拖动中 static final int ZOOM = 2; //缩放中 static final int BIGGER = 3; //放大ing static final int SMALLER = 4; //缩小ing private int mode = NONE; //当前的事件 private float beforeLenght; //两触点距离 private float afterLenght; //两触点距离 private float scale = 0.04f; //缩放的比例 X Y方向都是这个值 越大缩放的越快 private int screenW; private int screenH; /*处理拖动 变量 */ private int start_x; private int start_y; private int stop_x; private int stop_y; private TranslateAnimation trans; //处理超出边界的动画 public MyView(Context context) { super(context); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); p = new Paint(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); p.setColor(Color.YELLOW); canvas.drawCircle(100, 100, 50, p); } private Bitmap getCircleBitmap(Bitmap bitmap, int pixels) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); p.setAntiAlias(true); int x = bitmap.getWidth(); canvas.drawCircle(x / 2, x / 2, x / 2, p); p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, p); return output; } /** * 该构造函数在动态创建时,指定图片的初始高宽 * @param context * @param w * @param h */ public MyView(Context context,int w,int h) { super(context); this.setPadding(0, 0, 0, 0); screenW = w; screenH = h; } /** * 就算两点间的距离 */ private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); double d=x*x+y*y; return (float) Math.sqrt(d); } /** * 处理触碰.. */ @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: mode = DRAG; stop_x = (int) event.getRawX(); stop_y = (int) event.getRawY(); start_x = (int) event.getX(); start_y = stop_y - this.getTop(); String s = String.valueOf(start_x); Toast.makeText(getContext(),"当前点击的x的值:"+s,Toast.LENGTH_SHORT).show(); if (event.getPointerCount() == 2) beforeLenght = spacing(event); break; case MotionEvent.ACTION_POINTER_DOWN: if (spacing(event) > 10f) { mode = ZOOM; beforeLenght = spacing(event); } break; case MotionEvent.ACTION_UP: /*判断是否超出范围 并处理*/ int disX = 0; int disY = 0; if(getHeight()<=screenH || this.getTop()<0) { if(this.getTop()<0 ) { int dis = getTop(); this.layout(this.getLeft(), 0, this.getRight(), 0 + this.getHeight()); disY = dis - getTop(); } else if(this.getBottom()>screenH) { disY = getHeight()- screenH+getTop(); this.layout(this.getLeft(), screenH-getHeight(), this.getRight(), screenH); } } if(getWidth()<=screenW) { if(this.getLeft()<0) { disX = getLeft(); this.layout(0, this.getTop(), 0+getWidth(), this.getBottom()); } else if(this.getRight()>screenW) { disX = getWidth()-screenW+getLeft(); this.layout(screenW-getWidth(), this.getTop(), screenW, this.getBottom()); } } if(disX!=0 || disY!=0) { trans = new TranslateAnimation(disX, 0, disY, 0); trans.setDuration(500); this.startAnimation(trans); } mode = NONE; break; case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; case MotionEvent.ACTION_MOVE: /*处理拖动*/ if (mode == DRAG) { if(Math.abs(stop_x-start_x-getLeft())<88 && Math.abs(stop_y - start_y-getTop())<85) { this.setPosition(stop_x - start_x, stop_y - start_y, stop_x + this.getWidth() - start_x, stop_y - start_y + this.getHeight()); stop_x = (int) event.getRawX(); stop_y = (int) event.getRawY(); } } /*处理缩放*/ else if (mode == ZOOM) { if(spacing(event)>10f) { afterLenght = spacing(event); float gapLenght = afterLenght - beforeLenght; if(gapLenght == 0) { break; } else if(Math.abs(gapLenght)>5f) { if(gapLenght>0) { this.setScale(scale,BIGGER); }else { this.setScale(scale,SMALLER); } beforeLenght = afterLenght; } } } break; } return true; } /** * 实现处理缩放 */ private void setScale(float temp,int flag) { if(flag==BIGGER) { this.setFrame(this.getLeft()-(int)(temp*this.getWidth()), this.getTop()-(int)(temp*this.getHeight()), this.getRight()+(int)(temp*this.getWidth()), this.getBottom()+(int)(temp*this.getHeight())); }else if(flag==SMALLER){ this.setFrame(this.getLeft()+(int)(temp*this.getWidth()), this.getTop()+(int)(temp*this.getHeight()), this.getRight()-(int)(temp*this.getWidth()), this.getBottom()-(int)(temp*this.getHeight())); } } /** * 实现处理拖动 */ private void setPosition(int left,int top,int right,int bottom) { this.layout(left,top,right,bottom); }}
阅读全文
0 0
- Android-------自定义圆形图片实现多点触控
- 自定义圆形图片实现多点触控放大缩小和拖动
- 自定义圆形图片实现多点触控放大缩小和拖动
- 自定义圆形图片实现多点触控放大缩小和拖动
- Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控旋转,圆角矩形,圆形和仿刮刮卡效果
- android 自定义圆形图片实现
- Android-图片预览(自定义ImageView实现图片缩放,多点触控,自由移动)
- 自定义圆形图片,拖动、多点触控缩放,不超出边界
- Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控缩放
- Android自定义控件ImageViwe(四)——多点触控实现图片的自由移动
- android自定义ImageView实现圆形图片
- android 自定义ImageView实现圆形压缩图片
- Android自定义ImageView实现圆形图片
- 自定义View实现Android圆形图片
- Android自定义圆形图片
- Android自定义圆形图片
- Android自定义圆形图片
- Android自定义圆形图片
- IDC:函数列表
- PHP使用glob方法遍历文件夹下所有文件
- cmake构建时指定编译器架构(x86 or x64)
- 修改secureCRT的配置方案
- Spring : constructor-arg property 注入
- Android-------自定义圆形图片实现多点触控
- Hadoop大数据解决方案
- vim中Tab键设置为4个空格
- JS函数作用域及作用域
- svn Unable to connect to a repository at URL 'https://pc-201706292566/svn/YiBaiJia'
- itextSharp研究心得
- socket.io入门
- java里重载时的自动装箱与拆箱机制
- 数字图像梯度概念及计算(the gradient of the image)