基于 Flutter 3.x 实战跨平台混合开发网盘分享

#1

download:基于 Flutter 3.x 实战跨平台混合开发网盘分享

在我们实际开发和应用的过程中,我想每个人都或多或少遇到过需要加载圆角图像的场景,有的图像是不对称圆角、相反圆角等等。
我们可能会在互联网或Github上搜索一些第三方自定义视图,如RoundImageView。如果可以,如果不行就换一个库。总有一个图书馆在工作,对吧?
几年前,我在做一个项目的时候,遇到了这样的场景。设置好背景后,我加载了一张有圆角的图片,但是背景会漏出来。最后,在解决了UI裁剪之后,又出现了一个占用位图的问题。如果被占用的位图没有经过圆角处理,就覆盖了整个布局,不符合UI的审美。嘿,我要吐了。

@覆盖
受保护的void onDraw(画布画布){

if (getDrawable() == null) {
返回;
}

int sc = canvas.saveLayer(0,0,getWidth(),getHeight(),null,canvas。ALL _ SAVE _ FLAG);
//绘制源图像,是圆角矩形。
canvas . drawroundrect(new RectF(0,0,getWidth(),getHeight()),mRoundRadius,mRoundRadius,MP aint);
//设置混合模式
MP aint . setxfermode(mXfermode);
//绘制目标图像
canvas . draw bitmap(drawabletobitam(exchange size(getDrawable())),0,0,MP aint);
//恢复混合模式
MP aint . setxfermode(null);
canvas . restore count(sc);

}

/**
*图片拉起
/
私人可提款交易所Size(Drawable drawable) {
浮动刻度= 1.0f
scale = math . max(getWidth()
1.0f/drawable . getintrinsicwidth()、getHeight()

  • 1.0f/drawable . getintrinsicheight());
    drawable.setBounds(0,0,(int)(scale * draw able . getintrinsicwidth()),
    (int)(scale * drawable . getintrinsicheight());
    返回drawable
    }

专用位图drawabletobitmap(Drawable Drawable){
BitmapDrawable的可绘制实例){
BitmapDrawable BD =(BitmapDrawable)drawable;
返回BD . get bitmap();
}
int w = drawable . getintrinsicwidth()
int h = drawable . getintrinsicheight()
Bitmap Bitmap = Bitmap . create Bitmap(w,h,Bitmap。配置ARGB _ 8888);
Canvas canvas =新画布(位图);
drawable.setBounds(0,0,w,h);
drawable.draw(画布);
返回位图;
}
}
复制代码
BitmapShader指定范围呈现。
公共类ShaderRoundImageView扩展了AppCompatImageView {

//圆角大小,默认为10
private int mround radius = commutils . dip2px(15);

私漆mPaint

// 3x3矩阵,主要用来放大缩小。
私有矩阵mMatrix

//呈现图像,并使用图像为绘制的图形着色
私有BitmapShader mBitmapShader

公共ShaderRoundImageView(上下文context) {
this(上下文,空);
}

公共ShaderRoundImageView(上下文Context,AttributeSet attrs) {
this(context,attrs,0);
}

public ShaderRoundImageView(Context Context,AttributeSet attrs,int defStyleAttr) {
super(context,attrs,defStyleAttr);

m Matrix = new Matrix();
MP aint = new Paint();
MP aint . setantialias(true);

}

@覆盖
受保护的void onDraw(画布画布){
if (getDrawable() == null) {
返回;
}
bitmap bitmap = drawabletobitam(get drawable());
mBitmapShader =新的BitmapShader(位图,着色器。TileMode.CLAMP,着色器。tile mode . CLAMP);
浮动刻度= 1.0f
如果(!(bitmap . getWidth()= = getWidth()& & bitmap . getHeight()= = getHeight()){
//如果图片的宽度或高度与视图的宽度和高度不匹配,则计算需要缩放的比例;缩放图片的宽度和高度必须大于我们视图的宽度和高度;所以我们取这里的大值。
scale = math . max(getWidth()* 1.0f/bitmap . getWidth(),
getHeight()* 1.0f/bitmap . getHeight());
}
//着色器的变换矩阵,这里主要用来放大或者缩小。
mMatrix.setScale(scale,scale);
//设置变换矩阵
mbitmapshader . setlocalmatrix(m matrix);
//设置着色器
MP aint . set shader(mBitmapShader);
canvas . drawroundrect(new RectF(0,0,getWidth(),getHeight()),mRoundRadius,mRoundRadius,MP aint);
}

专用位图drawabletobitmap(Drawable Drawable){
BitmapDrawable的可绘制实例){
BitmapDrawable BD =(BitmapDrawable)drawable;
返回BD . get bitmap();
}
int w = drawable . getintrinsicwidth()
int h = drawable . getintrinsicheight()
Bitmap Bitmap = Bitmap . create Bitmap(w,h,Bitmap。配置ARGB _ 8888);
Canvas canvas =新画布(位图);
drawable.setBounds(0,0,w,h);
drawable.draw(画布);
返回位图;
}
}