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

概述

先看效果图

 

布局文件:

<?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

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 自定义view的简单应用(2) 毛玻璃效果的全部内容,希望文章能够帮你解决Android 自定义view的简单应用(2) 毛玻璃效果所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部