I have xml layout for adapter item like this.
<?xml version="1.0" enCoding="utf-8"?><androID.support.v7.Widget.CardVIEw xmlns:card_vIEw="http://schemas.androID.com/apk/res-auto" xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_margintop="5dp" androID:layout_marginleft="5dp" androID:layout_marginRight="5dp" card_vIEw:cardCornerRadius="5dp" androID:layout_wIDth="match_parent" androID:ID="@+ID/di_card_container" androID:layout_height="wrap_content"> <relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"> <ImageVIEw androID:ID="@+ID/di_iv_image" androID:scaleType="centerCrop" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" /> <relativeLayout androID:padding="10dp" androID:layout_below="@ID/di_iv_image" androID:layout_alignParentleft="true" androID:layout_alignParentBottom="true" androID:ID="@+ID/di_name_container" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content"> <TextVIEw androID:textSize="15dp" androID:textcolor="@color/textcolorPrimary" androID:ID="@+ID/di_tv_name" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" /> </relativeLayout> </relativeLayout></androID.support.v7.Widget.CardVIEw>
正如您所看到的那样,我将CardVIEw的圆角半径设置为5dp,而ImageVIEw with则适合其父CardVIEw的宽度.问题是ImageVIEw的顶角不像其父CardVIEw的角落那样弯曲.
This is the screenshot
通常,CardVIEw的子视图角会自动弯曲,如果它适合父CardVIEw.对?那么为什么我的ImageVIEw不工作?请问我的代码有什么问题?我该怎么办呢?
解决方法 所以这是前棒棒糖的常见行为.以下是修复它的步骤:第1步:将以下属性添加到您的cardVIEw
card_vIEw:cardUseCompatpadding="true"card_vIEw:cardPreventCornerOverlap="false"card_vIEw:cardCornerRadius="10dp"
第2步:使用围绕其顶部边框的自定义ImageVIEw:
public class RoundedtopImageVIEw extends ImageVIEw {private Paint mPaint;private Path mPath;private Bitmap mBitmap;private Matrix mMatrix;private int mRadius = displayUtils.convertDptopixel(10);private int mWIDth;private int mHeight;private Drawable mDrawable;public RoundedtopImageVIEw(Context context) { super(context); init();}public RoundedtopImageVIEw(Context context,AttributeSet attrs) { super(context,attrs); init();}public RoundedtopImageVIEw(Context context,AttributeSet attrs,int defStyleAttr) { super(context,attrs,defStyleAttr); init();}private voID init() { mPaint = new Paint(); mPaint.setcolor(color.WHITE); mPath = new Path();}@OverrIDepublic voID setimageDrawable(Drawable drawable) { mDrawable = drawable; if (drawable == null) { return; } mBitmap = drawabletoBitmap(drawable); int bDIWIDth = mBitmap.getWIDth(); int bDIHeight = mBitmap.getHeight(); //Fit to screen. float scale; if ((mHeight / (float)bDIHeight) >= (mWIDth / (float)bDIWIDth)){ scale = mHeight / (float)bDIHeight; } else { scale = mWIDth / (float)bDIWIDth; } float borderleft = (mWIDth - (bDIWIDth * scale)) / 2; float bordertop = (mHeight - (bDIHeight * scale)) / 2; mMatrix = getimageMatrix(); RectF drawableRect = new RectF(0,bDIWIDth,bDIHeight); RectF vIEwRect = new RectF(borderleft,bordertop,(bDIWIDth * scale) + borderleft,(bDIHeight * scale) + bordertop); mMatrix.setRectToRect(drawableRect,vIEwRect,Matrix.ScaletoFit.CENTER); invalIDate();}private Bitmap drawabletoBitmap(Drawable drawable) { Bitmap bitmap; if (drawable instanceof BitmapDrawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; if(bitmapDrawable.getBitmap() != null) { return bitmapDrawable.getBitmap(); } } if(drawable.getIntrinsicWIDth() <= 0 || drawable.getIntrinsicHeight() <= 0) { bitmap = Bitmap.createBitmap(1,1,Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel } else { bitmap = Bitmap.createBitmap(drawable.getIntrinsicWIDth(),drawable.getIntrinsicHeight(),Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0,canvas.getWIDth(),canvas.getHeight()); drawable.draw(canvas); return bitmap;}@OverrIDeprotected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) { super.onMeasure(wIDthMeasureSpec,heightmeasureSpec); mWIDth = MeasureSpec.getSize(wIDthMeasureSpec); mHeight = MeasureSpec.getSize(heightmeasureSpec); if ((mDrawable != null) && (mHeight > 0) && (mWIDth > 0)) { setimageDrawable(mDrawable); }}@OverrIDeprotected voID onDraw(Canvas canvas) { super.onDraw(canvas); if (mBitmap == null) { return; } canvas.drawcolor(color.transparent); mPath.reset(); mPath.moveto(0,mRadius); mPath.lineto(0,canvas.getHeight()); mPath.lineto(canvas.getWIDth(),mRadius); mPath.quadTo(canvas.getWIDth(),canvas.getWIDth() - mRadius,0); mPath.lineto(mRadius,0); mPath.quadTo(0,mRadius); canvas.drawPath(mPath,mPaint); canvas.clipPath(mPath); canvas.drawBitmap(mBitmap,mMatrix,mPaint);}}
第3步:只需使用RoundedtopImageVIEw替换xml中的ImageVIEw
第4步:在代码中将其用作常规imageVIEw,例如使用Picasso:
RoundedtopImageVIEw image = (RoundedtopImageVIEw) findVIEwByID(R.ID.di_iv_image);Picasso.with(context) .load("Some cool Url") .into(image);
编辑:添加了convertDptopixel函数
抱歉,我忘了添加这个,这是一个Util类的一部分,你可以在任何你想要的地方添加(在我的displayUtils类中):
public static int convertDptopixel(int dp) { displayMetrics displayMetrics = Resources.getSystem().getdisplayMetrics(); return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,displayMetrics);}总结
以上是内存溢出为你收集整理的Corners ImgeView适合在CardView内部没有半径像CardView在Android中的角落全部内容,希望文章能够帮你解决Corners ImgeView适合在CardView内部没有半径像CardView在Android中的角落所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)