小视频app源码,动态毛玻璃背景的简单实现
小视频app源码,动态毛玻璃背景的简单实现的相关代码
XML处调用
<com.lpoint.widget.BlurBGImageView
android:id="@+id/img_vague"
android:layout_width="300dp"
android:layout_centerInParent="true"
android:layout_height="200dp"/>
完整的BlurBGImageView类
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.Nullable;
@SuppressLint("AppCompatCustomView")
public class BlurBGImageView extends ImageView {
Bitmap overlay;
int scaleFactor = 2;
int radius = 8;
public BlurBGImageView(Context context) {
super(context);
}
public BlurBGImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public BlurBGImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setScaleFactor(int scaleFactor) {
this.scaleFactor = scaleFactor;
}
public void refreshBG(View bgView){
bgView.setDrawingCacheEnabled(true);
bgView.buildDrawingCache();
Bitmap bitmap1 = null;
try {
bitmap1 = getBitmap(bgView);
} catch (Exception e) {
e.printStackTrace();
}
if (bitmap1 != null){
blur(bitmap1,this,radius);//模糊处理
bitmap1.recycle();
}
bgView.setDrawingCacheEnabled(false);//清除缓存
}
private void blur(Bitmap bkg, ImageView view, float radius) {
if (overlay != null){
overlay.recycle();
}
overlay = Bitmap.createScaledBitmap(bkg, bkg.getWidth() / scaleFactor, bkg.getHeight() / scaleFactor, false);
overlay = blur(getContext(),overlay, radius);//高斯模糊
view.setImageBitmap(overlay);
}
private Bitmap blur(Context context, Bitmap image, float radius) {
RenderScript rs = RenderScript.create(context);
Bitmap outputBitmap = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888);
Allocation in = Allocation.createFromBitmap(rs, image);
Allocation out = Allocation.createFromBitmap(rs, outputBitmap);
ScriptIntrinsicBlur intrinsicBlur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
intrinsicBlur.setRadius(radius);
intrinsicBlur.setInput(in);
intrinsicBlur.forEach(out);
out.copyTo(outputBitmap);
image.recycle();
rs.destroy();
return outputBitmap;
}
private Bitmap getBitmap(View view){
//获取屏幕整张图片
Bitmap bitmap = view.getDrawingCache();
if (bitmap != null) {
//需要截取的长和宽
int outWidth = this.getWidth();
int outHeight = this.getHeight();
//获取需要截图部分的在屏幕上的坐标(view的左上角坐标)
int[] viewLocationArray = new int[2];
this.getLocationOnScreen(viewLocationArray);
int[] listLocationArray = new int[2];
view.getLocationOnScreen(listLocationArray);
//从屏幕整张图片中截取指定区域
bitmap = Bitmap.createBitmap(bitmap, viewLocationArray[0] - listLocationArray[0], viewLocationArray[1] - listLocationArray[1], outWidth, outHeight);
}
return bitmap;
}
}
以上就是 小视频app源码,动态毛玻璃背景的简单实现的相关代码,更多内容欢迎关注之后的文章