Android 自定义view的简单应用(2) 毛玻璃效果
16lz
2021-01-23
先看效果图
布局文件:
<?xml version="1.0" encoding="utf-8"?>
这里用到了RenderScript
blur.java
public class blur{ private static int width = 0; private static int height = 0; public static Bitmap goBlur(Bitmap bitmap,float radius,Context mContext) { width = bitmap.getWidth(); height = bitmap.getHeight(); Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); //Instantiate a new Renderscript RenderScript rs = RenderScript.create(mContext); //Create an Intrinsic Blur Script using the Renderscript ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); //Create the Allocations (in/out) with the Renderscript and the in/out bitmaps Allocation allIn = Allocation.createFromBitmap(rs, bitmap); Allocation allOut = Allocation.createFromBitmap(rs, result); //Set the radius of the blur: 0 < radius <= 25 blurScript.setRadius(radius); //Perform the Renderscript blurScript.setInput(allIn); blurScript.forEach(allOut); //Copy the final bitmap created by the out Allocation to the outBitmap allOut.copyTo(result); //After finishing everything, we destroy the Renderscript. rs.destroy(); return result; }}
CircleImageView.java
public class CircleImageView extends View implements View.OnTouchListener { boolean MoveCircle = false; boolean init = true; int CircleCenterX = 0; int CircleCenterY = 0; int radius = 0; int[] TouchMove = new int[2]; Bitmap newmap; public CircleImageView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); this.setOnTouchListener(this); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Bitmap head = BitmapFactory.decodeResource(getResources(), R.drawable.bg); if(init) { int width = this.getMeasuredWidth(); int height = this.getMeasuredHeight(); CircleCenterX = width / 2; CircleCenterY = height / 2; radius = width / 4; init = false; Bitmap tmp = head; for (int i = 0; i < 10; i++) { newmap = blur.goBlur(tmp, 25f, getContext()); tmp = newmap; } } if (newmap != null) canvas.drawBitmap(newmap, 0, 0, new Paint()); Path path = new Path(); path.addCircle(CircleCenterX,CircleCenterY,radius, Path.Direction.CCW); canvas.clipPath(path); canvas.drawBitmap(head,0,0,new Paint()); } @Override public boolean onTouch(View view, MotionEvent motionEvent) { if(motionEvent.getAction() == MotionEvent.ACTION_DOWN) { MoveCircle = false; /* 判断按下是否在圆内 计算按下坐标到当前圆心的距离是否大于圆半径 */ int downX = (int) motionEvent.getX(); int downY = (int) motionEvent.getY(); TouchMove[0] = downX; TouchMove[1] = downY; int distance = (int) Math.sqrt(Math.pow((downX - CircleCenterX),2) + Math.pow((downY - CircleCenterY),2)); if(distance < radius) { MoveCircle = true; } } if(motionEvent.getAction() == MotionEvent.ACTION_MOVE) { if(MoveCircle) { int X = (int) motionEvent.getX(); int Y = (int) motionEvent.getY(); CircleCenterX = CircleCenterX + X - TouchMove[0]; CircleCenterY = CircleCenterY + Y - TouchMove[1]; TouchMove[0] = CircleCenterX; TouchMove[1] = CircleCenterY; invalidate(); } } if(motionEvent.getAction() == MotionEvent.ACTION_UP) { MoveCircle = false; } return false; }}
更多相关文章
- 获取组件坐标系
- Android 高德地图给指定坐标显示图片,以及聚合显示
- 在Android中将子View的坐标转换为父View的坐标
- Android Cannas.drawTextView 方法坐标问题
- android百度地图半径画圆
- Android GPS获得经纬度并得到该坐标精确地址
- Android获取点击屏幕的位置坐标
- Android MotionEvent 坐标获取