随着移动应用UI越来越绚丽多彩,各种动画效果脱颖而出,毛玻璃效果大家想必是耳熟能详了吧。
目前刚好遇到实现这一功能,直接上代码:
public class DynamicBlurView extends View {
private Bitmap bitmap;
private RenderScript rs;
private Allocation inputAllocation;
private Allocation outputAllocation;
private ScriptIntrinsicBlur blurScript;
private float blurRadius; // 新增:模糊半径变量
public DynamicBlurView(Context context) {
super(context);
init();
}
public DynamicBlurView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
rs = RenderScript.create(getContext());
blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
blurRadius = 25f; // 初始化模糊半径,取值为0~25f之间
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 在这里获取您需要模糊的背景区域的截图,并转换为 Bitmap
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.test3);
inputAllocation = Allocation.createFromBitmap(rs, bitmap);
outputAllocation = Allocation.createTyped(rs, inputAllocation.getType());
blurScript.setRadius(blurRadius); // 设置当前的模糊半径
blurScript.setInput(inputAllocation);
blurScript.forEach(outputAllocation);
Bitmap blurredBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
outputAllocation.copyTo(blurredBitmap);
// 在画布上绘制半透明的未模糊图片
Paint paint = new Paint();
paint.setAlpha(128);
canvas.drawBitmap(bitmap, 0, 0, paint);
// 在半透明图片后面绘制模糊后的图片
canvas.drawBitmap(blurredBitmap, 0, 0, null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
// 根据触摸事件的位置动态调整模糊半径
float x = event.getX();
float maxX = getWidth();
blurRadius = x / maxX * 50; // 假设最大半径为 50
invalidate(); // 重绘视图
}
return true;
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (rs!= null) {
rs.destroy();
}
if (inputAllocation!= null) {
inputAllocation.destroy();
}
if (outputAllocation!= null) {
outputAllocation.destroy();
}
}
}
如何引用DynamicBlurView,代码如下:
<com.example.testapplication.DynamicBlurView
android:id="@+id/imageView4"
android:layout_width="match_parent"
android:layout_height="match_parent" />
效果图如下:
分享就到此为止了,谢谢点赞收藏!!