首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android - MaterialCardView角半径没有出现在片段中

Android - MaterialCardView角半径没有出现在片段中
EN

Stack Overflow用户
提问于 2022-01-09 04:59:48
回答 1查看 142关注 0票数 0

我创建了一个cornerRadius卡视图,我的代码在活动中工作得很好,但现在的问题是,卡纸视图没有在片段中显示圆角和高度,而是显示在设计代码和活动中。我的代码显示为blow: raounded_corners.xml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:focusable="true"
    android:clickable="true"
    android:background="@color/white"
    android:layout_height="match_parent">

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/text_bg"
        android:layout_width="110dp"
        android:layout_height="110dp"
        app:cardBackgroundColor="@color/green_500"
        app:cardCornerRadius="50dp"
        app:cardElevation="5dp"
        android:layout_gravity="center"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/image_session"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:src="@drawable/photo_male_7" />
    </com.google.android.material.card.MaterialCardView>


</RelativeLayout>

In片段

代码语言:javascript
运行
复制
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.raounded_corners,container,false);
        return v;
    }

raounded_corners.xml布局cornerRadius显示在活动中,但不显示在片段中

如何解决这个问题。

在活动中

in片段

EN

回答 1

Stack Overflow用户

发布于 2022-01-09 06:45:13

如果您试图创建imageview循环,我建议将这个approach.Create作为自定义视图,并在您的xml中设置它。它工作得很完美。如果这对您有帮助的话,我们将非常感谢您的支持。

创建一个自定义循环视图,如下所示。CircleImageView.java

代码语言:javascript
运行
复制
        package com.fishpott.fishpott5.Views;

        import android.content.Context;
        import android.content.res.TypedArray;
        import android.graphics.Bitmap;
        import android.graphics.BitmapShader;
        import android.graphics.Canvas;
        import android.graphics.Color;
        import android.graphics.ColorFilter;
        import android.graphics.Matrix;
        import android.graphics.Paint;
        import android.graphics.RectF;
        import android.graphics.Shader;
        import android.graphics.drawable.BitmapDrawable;
        import android.graphics.drawable.ColorDrawable;
        import android.graphics.drawable.Drawable;
        import android.net.Uri;
        import android.support.annotation.ColorInt;
        import android.support.annotation.ColorRes;
        import android.support.annotation.DrawableRes;
        import android.support.v7.widget.AppCompatImageView;
        import android.util.AttributeSet;
        import android.widget.ImageView;

        import com.fishpott.fishpott5.R;


        public class CircleImageView extends AppCompatImageView {

            private static final ImageView.ScaleType SCALE_TYPE = ImageView.ScaleType.CENTER_CROP;

            private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
            private static final int COLORDRAWABLE_DIMENSION = 2;

            private static final int DEFAULT_BORDER_WIDTH = 0;
            private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
            private static final int DEFAULT_FILL_COLOR = Color.TRANSPARENT;
            private static final boolean DEFAULT_BORDER_OVERLAY = false;

            private final RectF mDrawableRect = new RectF();
            private final RectF mBorderRect = new RectF();

            private final Matrix mShaderMatrix = new Matrix();
            private final Paint mBitmapPaint = new Paint();
            private final Paint mBorderPaint = new Paint();
            private final Paint mFillPaint = new Paint();

            private int mBorderColor = DEFAULT_BORDER_COLOR;
            private int mBorderWidth = DEFAULT_BORDER_WIDTH;
            private int mFillColor = DEFAULT_FILL_COLOR;

            private Bitmap mBitmap;
            private BitmapShader mBitmapShader;
            private int mBitmapWidth;
            private int mBitmapHeight;

            private float mDrawableRadius;
            private float mBorderRadius;

            private ColorFilter mColorFilter;

            private boolean mReady;
            private boolean mSetupPending;
            private boolean mBorderOverlay;
            private boolean mDisableCircularTransformation;

            public CircleImageView(Context context) {
                super(context);

                init();
            }

            public CircleImageView(Context context, AttributeSet attrs) {
                this(context, attrs, 0);
            }

            public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
                super(context, attrs, defStyle);

                TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);

                mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_civ_border_width, DEFAULT_BORDER_WIDTH);
                mBorderColor = a.getColor(R.styleable.CircleImageView_civ_border_color, DEFAULT_BORDER_COLOR);
                mBorderOverlay = a.getBoolean(R.styleable.CircleImageView_civ_border_overlay, DEFAULT_BORDER_OVERLAY);
                mFillColor = a.getColor(R.styleable.CircleImageView_civ_fill_color, DEFAULT_FILL_COLOR);

                a.recycle();

                init();
            }

            private void init() {
                super.setScaleType(SCALE_TYPE);
                mReady = true;

                if (mSetupPending) {
                    setup();
                    mSetupPending = false;
                }
            }

            @Override
            public ImageView.ScaleType getScaleType() {
                return SCALE_TYPE;
            }

            @Override
            public void setScaleType(ImageView.ScaleType scaleType) {
                if (scaleType != SCALE_TYPE) {
                    throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
                }
            }

            @Override
            public void setAdjustViewBounds(boolean adjustViewBounds) {
                if (adjustViewBounds) {
                    throw new IllegalArgumentException("adjustViewBounds not supported.");
                }
            }

            @Override
            protected void onDraw(Canvas canvas) {
                if (mDisableCircularTransformation) {
                    super.onDraw(canvas);
                    return;
                }

                if (mBitmap == null) {
                    return;
                }

                if (mFillColor != Color.TRANSPARENT) {
                    canvas.drawCircle(mDrawableRect.centerX(), mDrawableRect.centerY(), mDrawableRadius, mFillPaint);
                }
                canvas.drawCircle(mDrawableRect.centerX(), mDrawableRect.centerY(), mDrawableRadius, mBitmapPaint);
                if (mBorderWidth > 0) {
                    canvas.drawCircle(mBorderRect.centerX(), mBorderRect.centerY(), mBorderRadius, mBorderPaint);
                }
            }

            @Override
            protected void onSizeChanged(int w, int h, int oldw, int oldh) {
                super.onSizeChanged(w, h, oldw, oldh);
                setup();
            }

            @Override
            public void setPadding(int left, int top, int right, int bottom) {
                super.setPadding(left, top, right, bottom);
                setup();
            }

            @Override
            public void setPaddingRelative(int start, int top, int end, int bottom) {
                super.setPaddingRelative(start, top, end, bottom);
                setup();
            }

            public int getBorderColor() {
                return mBorderColor;
            }

            public void setBorderColor(@ColorInt int borderColor) {
                if (borderColor == mBorderColor) {
                    return;
                }

                mBorderColor = borderColor;
                mBorderPaint.setColor(mBorderColor);
                invalidate();
            }

            /**
            * @deprecated Use {@link #setBorderColor(int)} instead
            */
            @Deprecated
            public void setBorderColorResource(@ColorRes int borderColorRes) {
                setBorderColor(getContext().getResources().getColor(borderColorRes));
            }

            /**
            * Return the color drawn behind the circle-shaped drawable.
            *
            * @return The color drawn behind the drawable
            *
            * @deprecated Fill color support is going to be removed in the future
            */
            @Deprecated
            public int getFillColor() {
                return mFillColor;
            }

            /**
            * Set a color to be drawn behind the circle-shaped drawable. Note that
            * this has no effect if the drawable is opaque or no drawable is set.
            *
            * @param fillColor The color to be drawn behind the drawable
            *
            * @deprecated Fill color support is going to be removed in the future
            */
            @Deprecated
            public void setFillColor(@ColorInt int fillColor) {
                if (fillColor == mFillColor) {
                    return;
                }

                mFillColor = fillColor;
                mFillPaint.setColor(fillColor);
                invalidate();
            }

            /**
            * Set a color to be drawn behind the circle-shaped drawable. Note that
            * this has no effect if the drawable is opaque or no drawable is set.
            *
            * @param fillColorRes The color resource to be resolved to a color and
            *                     drawn behind the drawable
            *
            * @deprecated Fill color support is going to be removed in the future
            */
            @Deprecated
            public void setFillColorResource(@ColorRes int fillColorRes) {
                setFillColor(getContext().getResources().getColor(fillColorRes));
            }

            public int getBorderWidth() {
                return mBorderWidth;
            }

            public void setBorderWidth(int borderWidth) {
                if (borderWidth == mBorderWidth) {
                    return;
                }

                mBorderWidth = borderWidth;
                setup();
            }

            public boolean isBorderOverlay() {
                return mBorderOverlay;
            }

            public void setBorderOverlay(boolean borderOverlay) {
                if (borderOverlay == mBorderOverlay) {
                    return;
                }

                mBorderOverlay = borderOverlay;
                setup();
            }

            public boolean isDisableCircularTransformation() {
                return mDisableCircularTransformation;
            }

            public void setDisableCircularTransformation(boolean disableCircularTransformation) {
                if (mDisableCircularTransformation == disableCircularTransformation) {
                    return;
                }

                mDisableCircularTransformation = disableCircularTransformation;
                initializeBitmap();
            }

            @Override
            public void setImageBitmap(Bitmap bm) {
                super.setImageBitmap(bm);
                initializeBitmap();
            }

            @Override
            public void setImageDrawable(Drawable drawable) {
                super.setImageDrawable(drawable);
                initializeBitmap();
            }

            @Override
            public void setImageResource(@DrawableRes int resId) {
                super.setImageResource(resId);
                initializeBitmap();
            }

            @Override
            public void setImageURI(Uri uri) {
                super.setImageURI(uri);
                initializeBitmap();
            }

            @Override
            public void setColorFilter(ColorFilter cf) {
                if (cf == mColorFilter) {
                    return;
                }

                mColorFilter = cf;
                applyColorFilter();
                invalidate();
            }

            @Override
            public ColorFilter getColorFilter() {
                return mColorFilter;
            }

            private void applyColorFilter() {
                if (mBitmapPaint != null) {
                    mBitmapPaint.setColorFilter(mColorFilter);
                }
            }

            private Bitmap getBitmapFromDrawable(Drawable drawable) {
                if (drawable == null) {
                    return null;
                }

                if (drawable instanceof BitmapDrawable) {
                    return ((BitmapDrawable) drawable).getBitmap();
                }

                try {
                    Bitmap bitmap;

                    if (drawable instanceof ColorDrawable) {
                        bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
                    } else {
                        bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
                    }

                    Canvas canvas = new Canvas(bitmap);
                    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
                    drawable.draw(canvas);
                    return bitmap;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

            private void initializeBitmap() {
                if (mDisableCircularTransformation) {
                    mBitmap = null;
                } else {
                    mBitmap = getBitmapFromDrawable(getDrawable());
                }
                setup();
            }

            private void setup() {
                if (!mReady) {
                    mSetupPending = true;
                    return;
                }

                if (getWidth() == 0 && getHeight() == 0) {
                    return;
                }

                if (mBitmap == null) {
                    invalidate();
                    return;
                }

                mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

                mBitmapPaint.setAntiAlias(true);
                mBitmapPaint.setShader(mBitmapShader);

                mBorderPaint.setStyle(Paint.Style.STROKE);
                mBorderPaint.setAntiAlias(true);
                mBorderPaint.setColor(mBorderColor);
                mBorderPaint.setStrokeWidth(mBorderWidth);

                mFillPaint.setStyle(Paint.Style.FILL);
                mFillPaint.setAntiAlias(true);
                mFillPaint.setColor(mFillColor);

                mBitmapHeight = mBitmap.getHeight();
                mBitmapWidth = mBitmap.getWidth();

                mBorderRect.set(calculateBounds());
                mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2.0f, (mBorderRect.width() - mBorderWidth) / 2.0f);

                mDrawableRect.set(mBorderRect);
                if (!mBorderOverlay && mBorderWidth > 0) {
                    mDrawableRect.inset(mBorderWidth - 1.0f, mBorderWidth - 1.0f);
                }
                mDrawableRadius = Math.min(mDrawableRect.height() / 2.0f, mDrawableRect.width() / 2.0f);

                applyColorFilter();
                updateShaderMatrix();
                invalidate();
            }

            private RectF calculateBounds() {
                int availableWidth  = getWidth() - getPaddingLeft() - getPaddingRight();
                int availableHeight = getHeight() - getPaddingTop() - getPaddingBottom();

                int sideLength = Math.min(availableWidth, availableHeight);

                float left = getPaddingLeft() + (availableWidth - sideLength) / 2f;
                float top = getPaddingTop() + (availableHeight - sideLength) / 2f;

                return new RectF(left, top, left + sideLength, top + sideLength);
            }

            private void updateShaderMatrix() {
                float scale;
                float dx = 0;
                float dy = 0;

                mShaderMatrix.set(null);

                if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
                    scale = mDrawableRect.height() / (float) mBitmapHeight;
                    dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
                } else {
                    scale = mDrawableRect.width() / (float) mBitmapWidth;
                    dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
                }

                mShaderMatrix.setScale(scale, scale);
                mShaderMatrix.postTranslate((int) (dx + 0.5f) + mDrawableRect.left, (int) (dy + 0.5f) + mDrawableRect.top);

                mBitmapShader.setLocalMatrix(mShaderMatrix);
            }

        }

在xml中设置视图

代码语言:javascript
运行
复制
            <com.fishpott.fishpott5.Views.CircleImageView
                android:id="@+id/activity_setprofilepicture_profilepicture_imageview"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:contentDescription="@string/none"
                android:src="@drawable/setprofilepicture_activity_imageholder_default_image"
                app:civ_border_color="@android:color/transparent"
                app:civ_border_width="0dp" />

在CircleImageView的xml调用中看到“视图”是因为我的CircleImageView.java位于“视图”文件夹/包中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70638575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档