我是靠谱客的博主 英俊羽毛,这篇文章主要介绍Android 自定义view的简单应用(2) 毛玻璃效果,现在分享给大家,希望可以做个参考。

先看效果图

 

布局文件:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="20dp" android:background="#000000" tools:context=".MainActivity"> <myapp.customview.CustomView.CircleImageView android:clickable="true" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>

 

这里用到了RenderScript

blur.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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; } }
复制代码
1
CircleImageView.java
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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 自定义view的简单应用(2) 毛玻璃效果的全部内容,更多相关Android内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部