赞
踩
implementation 'com.github.bumptech.glide:glide:4.9.0'
implementation 'com.github.bumptech.glide:annotations:4.9.0'
implementation 'com.github.bumptech.glide:okhttp3-integration:4.9.0'
implementation 'jp.wasabeef:glide-transformations:4.0.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
转换类GlideRoundTransform:
package com.ford.hmi.appstore.utils; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.text.TextUtils; import androidx.annotation.NonNull; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.load.resource.bitmap.TransformationUtils; import java.security.MessageDigest; public class GlideRoundTransform extends CenterCrop { private static float mRadius = 0f; public static final int DEFAULT_RADIUS = 4; public GlideRoundTransform(Context context) { this(context, DEFAULT_RADIUS); } public GlideRoundTransform(Context context, int radius) { mRadius = radius; } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { Bitmap transform = super.transform(pool, toTransform, outWidth, outHeight); return roundCrop(pool, transform); } private static Bitmap roundCrop(BitmapPool pool, Bitmap source) { if (source == null) { return null; } Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); //Draw rounded corners RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); canvas.drawRoundRect(rectF, mRadius, mRadius, paint); return result; } @Override public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) { } }
GlideRoundTransform roundTransform =
new GlideRoundTransform(requireContext(), AppStoreCommon.GLIDE_IMAGE_RADIUS);
Glide.with(requireContext())
.load(firstCardInfo.getCoverPic())
.error(R.drawable.applet_first)
.transform(roundTransform)
.into(mDataBinding.appletFirstBg);
缺点使用过程中失效的问题,解决办法:通过降低Glide的版本为3.XXX即可。
import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; import android.os.Build; import android.util.AttributeSet; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; import com.ford.hmi.appstore.R; public class RoundConstraintLayout extends ConstraintLayout { private Path mPath; private Paint mPaint; private RectF mRectF; private float mRadius; private boolean isClipBackground; public static final int CURRENT_SDK = 28; public RoundConstraintLayout(@NonNull Context context) { this(context, null); } public RoundConstraintLayout(@NonNull Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } /** * RoundConstraintLayout. */ public RoundConstraintLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RoundConstraintLayout); mRadius = ta.getDimension(R.styleable.RoundConstraintLayout_rcRadius, 0); isClipBackground = ta.getBoolean(R.styleable.RoundConstraintLayout_rcClipBackground, true); ta.recycle(); mPath = new Path(); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mRectF = new RectF(); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); } public void setRadius(float radius) { mRadius = radius; postInvalidate(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mRectF.set(0, 0, w, h); } @SuppressLint("MissingSuperCall") @Override public void draw(Canvas canvas) { if (Build.VERSION.SDK_INT >= CURRENT_SDK) { draw28(canvas); } else { draw27(canvas); } } @Override protected void dispatchDraw(Canvas canvas) { if (Build.VERSION.SDK_INT >= CURRENT_SDK) { dispatchDraw28(canvas); } else { dispatchDraw27(canvas); } } private void draw27(Canvas canvas) { if (isClipBackground) { canvas.saveLayer(mRectF, null, Canvas.ALL_SAVE_FLAG); super.draw(canvas); canvas.drawPath(genPath(), mPaint); canvas.restore(); } else { super.draw(canvas); } } private void draw28(Canvas canvas) { if (isClipBackground) { canvas.save(); canvas.clipPath(genPath()); super.draw(canvas); canvas.restore(); } else { super.draw(canvas); } } private void dispatchDraw27(Canvas canvas) { canvas.saveLayer(mRectF, null, Canvas.ALL_SAVE_FLAG); super.dispatchDraw(canvas); canvas.drawPath(genPath(), mPaint); canvas.restore(); } private void dispatchDraw28(Canvas canvas) { canvas.save(); canvas.clipPath(genPath()); super.dispatchDraw(canvas); canvas.restore(); } private Path genPath() { mPath.reset(); mPath.addRoundRect(mRectF, mRadius, mRadius, Path.Direction.CW); return mPath; } }
<declare-styleable name="RoundConstraintLayout">
<attr name="rcRadius" format="dimension" />
<attr name="rcClipBackground" format="boolean" />
</declare-styleable>
直接同过设置布局的圆角,就不用再设置父布局中同宽度子控件的圆角了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。