Unable to get exact circle shape when using card view

前端 未结 11 1868
旧时难觅i
旧时难觅i 2020-12-25 10:12

I\'m using card view for floating action button in android material design. I\'m using following code for get the circle



        
相关标签:
11条回答
  • 2020-12-25 11:08

    card_layout.xml

    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="250dp"
        android:layout_height="200dp">
    
        <ImageView
            android:id="@+id/card_thumbnail_image"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            style="@style/card_thumbnail_image"/>
    </android.support.v7.widget.CardView>
    

    MainActivity.java

     ImageView imageView = (ImageView) findViewById(R.id.card_thumbnail_image);
        Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rose);
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            //Default 
            imageView.setBackgroundResource(R.drawable.rose);
        } else {
            //RoundCorners 
            RoundCornersDrawable round = new RoundCornersDrawable(mBitmap,
                    getResources().getDimension(R.dimen.cardview_default_radius), 0); //or your custom radius
    
            CardView cardView = (CardView) findViewById(R.id.card_view);
            cardView.setPreventCornerOverlap(false); //it is very important
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
                imageView.setBackground(round);
            else
                imageView.setBackgroundDrawable(round);
        }
    
    RoundCornersDrawable.java
    
        public class RoundCornersDrawable extends Drawable {
    
        private final float mCornerRadius;
        private final RectF mRect = new RectF();
        //private final RectF mRectBottomR = new RectF();
        //private final RectF mRectBottomL = new RectF();
        private final BitmapShader mBitmapShader;
        private final Paint mPaint;
        private final int mMargin;
    
        public RoundCornersDrawable(Bitmap bitmap, float cornerRadius, int margin) {
            mCornerRadius = cornerRadius;
    
            mBitmapShader = new BitmapShader(bitmap,
                    Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    
            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setShader(mBitmapShader);
    
            mMargin = margin;
        }
    
        @Override
        protected void onBoundsChange(Rect bounds) {
            super.onBoundsChange(bounds);
            mRect.set(mMargin, mMargin, bounds.width() - mMargin, bounds.height() - mMargin);
            //mRectBottomR.set( (bounds.width() -mMargin) / 2, (bounds.height() -mMargin)/ 2,bounds.width() - mMargin, bounds.height() - mMargin);
           // mRectBottomL.set( 0,  (bounds.height() -mMargin) / 2, (bounds.width() -mMargin)/ 2, bounds.height() - mMargin);
        }
    
        @Override
        public void draw(Canvas canvas) {
            canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mPaint);
            //canvas.drawRect(mRectBottomR, mPaint); //only bottom-right corner not rounded
            //canvas.drawRect(mRectBottomL, mPaint); //only bottom-left corner not rounded
    
        }
    
        @Override
        public int getOpacity() {
            return PixelFormat.TRANSLUCENT;
        }
    
        @Override
        public void setAlpha(int alpha) {
            mPaint.setAlpha(alpha);
        }
    
        @Override
        public void setColorFilter(ColorFilter cf) {
            mPaint.setColorFilter(cf);
        }
    
    
    }
    
    0 讨论(0)
  • 2020-12-25 11:10

    To achieve a circular shape using Card view you can set the shape property, android:shape="ring".
    app:cardCornerRadius should be set to half the width or height of the child view

    <android.support.v7.widget.CardView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:innerRadius="0dp"
            android:shape="ring"
            app:cardCornerRadius="75dp">
    
            <ImageView
                android:layout_width="150dp"
                android:layout_height="150dp"
                android:layout_gravity="center"
                android:background="@drawable/image" />
         </android.support.v7.widget.CardView>
    
    0 讨论(0)
  • 2020-12-25 11:15

    use

    shape = "ring"

    use same layout_height and layout_weight

    and

    app:cardCornerRadius= half of layout_height or layout_weight

    example

    <android.support.v7.widget.CardView
                            android:id="@+id/cardview"
                            android:layout_width="110dp"
                            android:layout_height="110dp"
                            android:shape="ring"
                            app:cardCornerRadius="55dp">
    </android.support.v7.widget.CardView>
    
    0 讨论(0)
  • 2020-12-25 11:16

    I have solved the problem. Now android providing design library for material design, which has the FloatingActionButton. No need of customizing card view for floating action button.

    <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="@dimen/fab_margin"  />
    

    Add design library in gradle dependencies

    compile 'com.android.support:design:23.1.1'
    

    For more detail refer this link

    0 讨论(0)
  • 2020-12-25 11:16

    first import the drawbleToolBox library in your project. with this library, you can create drawable dynamically.

    for make your cardview circle your radius must be half of its height/widht.

                    int radius = cardView.getHeight()/2;
                    Drawable drawable = new DrawableBuilder()
                        .rectangle()
                        .solidColor(0xffffffff)
    
                        .topRightRadius(radius) // in pixels
                        .bottomRightRadius(radius)
                         //otherplaces
                        .build();
    
    
    
                    holder.cardView.setBackground(drawable);
    

    if you are using cardview in your recycleview, getting the cardview widths doesn't work becuse it doesn't create yet. so you should do as below

    holder.cardView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
        {
            @Override
            public boolean onPreDraw()
            {
             //codes here.
            }
         }
    
    0 讨论(0)
提交回复
热议问题