亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【自定義】帶圓環和字的圓形ImageView

2019-11-09 16:11:51
字體:
來源:轉載
供稿:網友

示例圖:

廢話不多說,直接上代碼

public class CircleImageView extends ImageView {    PRivate static final ScaleType SCALE_TYPE = 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 Paint paint = new Paint();;    private int mBorderColor = DEFAULT_BORDER_COLOR;    private int mBorderWidth = DEFAULT_BORDER_WIDTH;    private int mFillColor = DEFAULT_FILL_COLOR;    private int mytextSize = 30;    public String mytextContent = "";    private int mytextContentColor = Color.BLACK;     //矩形對象,用于計算文字位置時使用    private Rect rect;    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);        mytextSize = a.getDimensionPixelSize(R.styleable.CircleImageView_mytextSize,30);        mytextContentColor = a.getColor(R.styleable.CircleImageView_mytextContent_color,DEFAULT_BORDER_COLOR);        a.recycle();        init();    }    private void init() {        super.setScaleType(SCALE_TYPE);        mReady = true;        if (mSetupPending) {            setup();            mSetupPending = false;        }    }    @Override    public ScaleType getScaleType() {        return SCALE_TYPE;    }    @Override    public void setScaleType(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) {        //將畫筆的文字大小設置為我們定義的大小        paint.setTextSize(mytextSize);        paint.setColor(mytextContentColor);        rect = new Rect();        /**         * 此方法可以獲得文字所在的矩形區域,并賦給rect         * 參數1:傳入文字的內容         * 參數2:傳入文字起始的長度,一般為0         * 參數3:傳入文字結束的長度,一般為text.length         * 參數4:傳入一個Rect矩形對象         */        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(!"".equals(mytextContent)){            paint.getTextBounds(mytextContent, 0, mytextContent.length(), rect);            canvas.drawText(mytextContent, getWidth() / 2 - rect.width() / 2, getHeight() / 2 + rect.height() / 2, paint);        }        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);    }}

attrs文件:

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="CircleImageView">        <attr name="civ_border_width" format="dimension" />        <attr name="civ_border_color" format="color" />        <attr name="mytextContent_color" format="color" />        <attr name="civ_border_overlay" format="boolean" />        <attr name="civ_fill_color" format="color" />        <attr name="mytextSize" format="dimension" type="dimension"></attr>    </declare-styleable></resources>

使用方法:

layout.xml里面:	<com....CircleImageView>  	    android:id="@+id/tou"            android:layout_width="100dp"            android:layout_height="100dp"            android:src="@mipmap/a"            android:layout_marginTop="20dp"            android:layout_centerHorizontal="true"            app:civ_border_width="2dp"            app:civ_border_color="@color/colorAccent"            app:mytextSize="30sp"            app:mytextContent_color="@color/colorAccent"	</com....CircleImageView>activity里面:  CircleImageView iv = findv...(R.id.tou);  iv.setImageView()或者其他方法,設置圖片  iv.mytextContect = "張三"


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩有码在线观看| 国产精品精品久久久久久| 久久影视三级福利片| 欧美电影在线观看高清| 日本高清视频一区| 91香蕉嫩草神马影院在线观看| 午夜剧场成人观在线视频免费观看| 国产精品99导航| 欧美黑人一级爽快片淫片高清| 日韩在线免费观看视频| 日韩亚洲在线观看| 久久久久久成人| 久久精品视频在线| 国产精品视频xxx| 亚洲第一视频网| 欧美日韩中文字幕综合视频| 久久精品99无色码中文字幕| 国产成人精品久久亚洲高清不卡| 色综合久综合久久综合久鬼88| 欧美成人久久久| 欧美美女操人视频| 国产精品永久免费在线| 欧美亚洲在线播放| 色悠悠久久久久| 亚洲精品国产品国语在线| 美日韩丰满少妇在线观看| 国外成人在线视频| 国产精品成人播放| 国产一区二区三区欧美| 91九色国产视频| 亚洲欧洲在线播放| 久久视频国产精品免费视频在线| 97视频人免费观看| 一道本无吗dⅴd在线播放一区| 精品国产一区久久久| 亚洲一区二区三区视频| 欧美激情一区二区三区在线视频观看| 久久久久久久av| 欧美日韩在线另类| 精品久久久精品| 亚洲女人天堂色在线7777| 青青草国产精品一区二区| 91精品国产一区| 日本国产欧美一区二区三区| 久久久久一本一区二区青青蜜月| 最近免费中文字幕视频2019| 国产精品丝袜视频| 欧美俄罗斯性视频| 国产成人综合av| 成人国产精品日本在线| 亚洲精选中文字幕| 日韩av电影中文字幕| 亚洲成人黄色在线观看| 91高清免费视频| 亚洲国产婷婷香蕉久久久久久| 亚洲在线观看视频网站| 亚洲高清久久久久久| 亚洲影院高清在线| 国产精品电影观看| 日韩精品视频免费专区在线播放| 亚洲午夜女主播在线直播| 日韩少妇与小伙激情| 亚洲高清久久网| 成人在线免费观看视视频| 韩曰欧美视频免费观看| 国产精品免费网站| 久久精品中文字幕免费mv| 亚洲色图激情小说| 97在线免费视频| 国产日韩欧美在线看| 中文字幕日韩欧美在线| 九九久久综合网站| 欧美韩国理论所午夜片917电影| 成人免费高清完整版在线观看| 欧美老女人性生活| 亚洲精品免费网站| 成人国产精品一区| 欧美激情a∨在线视频播放| 久久久精品2019中文字幕神马| 国产精品亚洲自拍| 国产精品美女主播在线观看纯欲| 久久综合免费视频影院| 欧美人与性动交| 欧美国产日本高清在线| 久久人人爽人人爽人人片av高清| 91香蕉国产在线观看| 性夜试看影院91社区| 最近2019年手机中文字幕| 2019中文字幕全在线观看| 亚洲娇小xxxx欧美娇小| 欧美日韩在线观看视频| 91精品久久久久久久久久另类| 欧美巨乳在线观看| 欧美福利小视频| 精品偷拍各种wc美女嘘嘘| 38少妇精品导航| 日韩在线免费视频| 丝袜美腿精品国产二区| 97免费视频在线播放| 亚洲国产欧美日韩精品| 国产自产女人91一区在线观看| 欧美精品第一页在线播放| 久久亚洲精品中文字幕冲田杏梨| 成人黄色av网| 精品国产欧美一区二区三区成人| 欲色天天网综合久久| 欧美大片在线影院| 日韩中文字幕国产精品| 性欧美长视频免费观看不卡| 欧美风情在线观看| 精品调教chinesegay| 欧美大奶子在线| 日韩精品中文字幕在线播放| 日韩在线视频免费观看| 久久免费成人精品视频| 亚洲自拍偷拍一区| 国内精品久久久久影院优| 亚洲欧美日韩综合| 搡老女人一区二区三区视频tv| 亚洲在线免费观看| 日韩免费视频在线观看| 91在线免费观看网站| 狠狠色噜噜狠狠狠狠97| 久久影院在线观看| 欧美日韩一区二区在线| 久久久久久久久久av| 成人在线中文字幕| 精品久久久久久亚洲精品| 午夜精品理论片| 亚洲aaaaaa| 亚洲网站在线看| 97在线视频免费看| 91精品国产高清久久久久久| 亚洲成人激情小说| 亚洲精品视频久久| 久久人人爽人人爽人人片亚洲| 国产成人中文字幕| 欧美大尺度在线观看| 视频一区视频二区国产精品| 精品久久久精品| 在线观看日韩视频| 日韩欧美成人网| 欧美日韩国产专区| 久久精品亚洲国产| 国内精品模特av私拍在线观看| 啊v视频在线一区二区三区| 日韩成人av在线| 国产美女久久精品香蕉69| 中文国产成人精品久久一| 欧美日韩美女在线| 亚洲人成亚洲人成在线观看| 欧美巨大黑人极品精男| 日韩av资源在线播放| 国产精品一区二区三区久久| 亚洲三级免费看| 国产精品黄色影片导航在线观看| 日本国产高清不卡| 成人免费xxxxx在线观看| 国产91精品在线播放| 国产精品高潮呻吟视频| 日韩av影视综合网| 国产成人在线亚洲欧美| 亚洲精品在线不卡| 国产97在线播放|