最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android圓形控件實(shí)現(xiàn)畫(huà)圓效果

 更新時(shí)間:2021年05月25日 11:22:20   作者:皮皮嘟  
這篇文章主要為大家詳細(xì)介紹了Android圓形控件實(shí)現(xiàn)畫(huà)圓效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android圓形控件實(shí)現(xiàn)畫(huà)圓效果的具體代碼,供大家參考,具體內(nèi)容如下

實(shí)現(xiàn)圓形控件

實(shí)現(xiàn)如下

package com.example.demo.util;

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.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.util.AttributeSet;
import android.widget.ImageView;

import androidx.annotation.Nullable;

import com.example.demo.R;

public class CircleImageView extends androidx.appcompat.widget.AppCompatImageView {
    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 = 1;

    private static final int DEFAULT_BORDER_WIDTH = 0;
    private static final int DEFAULT_BORDER_COLOR = Color.BLACK;

    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 int mBorderColor = DEFAULT_BORDER_COLOR;
    private int mBorderWidth = DEFAULT_BORDER_WIDTH;

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

    private float mDrawableRadius;
    private float mBorderRadius;

    private boolean mReady;
    private boolean mSetupPending;


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

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

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

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

        mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
        mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);

        a.recycle();

        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
    protected void onDraw(Canvas canvas) {
        if (getDrawable() == null) {
            return;
        }

        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
    }

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

    public int getBorderColor() {
        return mBorderColor;
    }

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

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

    public int getBorderWidth() {
        return mBorderWidth;
    }

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

        mBorderWidth = borderWidth;
        setup();
    }

    @Override
    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        mBitmap = bm;
        setup();
    }

    @Override
    public void setImageDrawable(Drawable drawable) {
        super.setImageDrawable(drawable);
        mBitmap = getBitmapFromDrawable(drawable);
        setup();
    }

    @Override
    public void setImageResource(int resId) {
        super.setImageResource(resId);
        mBitmap = getBitmapFromDrawable(getDrawable());
        setup();
    }

    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 (OutOfMemoryError e) {
            return null;
        }
    }

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

        if (mBitmap == null) {
            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);

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

        mBorderRect.set(0, 0, getWidth(), getHeight());
        mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);

        mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
        mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);

        updateShaderMatrix();
        invalidate();
    }

    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) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);

        mBitmapShader.setLocalMatrix(mShaderMatrix);
    }

}

使用如下

<com.example.demo.util.CircleImageView
                android:id="@+id/iv_avatar"
                android:layout_width="35dp"
                android:layout_height="35dp"
                app:border_color="#00000000"
                android:layout_gravity="center_vertical"
                android:src="@drawable/ic_launcher_background">
</com.example.demo.util.CircleImageView>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android10 App 啟動(dòng)分析進(jìn)程創(chuàng)建源碼解析

    Android10 App 啟動(dòng)分析進(jìn)程創(chuàng)建源碼解析

    這篇文章主要為大家介紹了Android10 App啟動(dòng)分析進(jìn)程創(chuàng)建源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 詳談閃屏頁(yè)相關(guān)處理

    詳談閃屏頁(yè)相關(guān)處理

    本文主要介紹了閃屏頁(yè)相關(guān)處理方面的知識(shí),具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • Android 五大布局方式詳解

    Android 五大布局方式詳解

    本文主要介紹Android 五大布局的知識(shí)資料,這里整理了詳細(xì)的布局資料及實(shí)現(xiàn)示例代碼,和實(shí)現(xiàn)效果圖,有興趣的小伙伴可以參考下
    2016-09-09
  • 務(wù)必掌握的Android十六進(jìn)制狀態(tài)管理最佳實(shí)踐

    務(wù)必掌握的Android十六進(jìn)制狀態(tài)管理最佳實(shí)踐

    這篇文章主要為大家介紹了務(wù)必掌握的Android十六進(jìn)制狀態(tài)管理最佳實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Android?studio下載安裝使用SVN的方法

    Android?studio下載安裝使用SVN的方法

    在AndroidStudio中開(kāi)發(fā)版本控制,除了Git就是SVN,和Eclipse不同,Android Studio沒(méi)有提供單獨(dú)的插件,只能和SVN客戶端關(guān)聯(lián)使用,這篇文章主要介紹了Android?studio使用SVN的方法,需要的朋友可以參考下
    2022-09-09
  • Android中Glide加載庫(kù)的圖片緩存配置究極指南

    Android中Glide加載庫(kù)的圖片緩存配置究極指南

    這篇文章主要介紹了Android中Glide加載庫(kù)的圖片緩存配置究極指南,Glide是一款高人氣的安卓多媒體資源加載庫(kù),本文對(duì)其緩存設(shè)置和優(yōu)化作了詳細(xì)講解,需要的朋友可以參考下
    2016-04-04
  • Flutter使用AnimatedBuilder實(shí)現(xiàn)動(dòng)效復(fù)用

    Flutter使用AnimatedBuilder實(shí)現(xiàn)動(dòng)效復(fù)用

    Animation和AnimationWidget都是將組件和動(dòng)畫(huà)一起完成的。有些時(shí)候,我們只是想動(dòng)效復(fù)用,而不關(guān)心組件構(gòu)建,這個(gè)時(shí)候就可以使用 AnimatedBuilder了。本文詳細(xì)講解了AnimatedBuilder的使用,需要的可以參考一下
    2022-04-04
  • Android Studio 3.6運(yùn)行模擬器時(shí)Emulator警告問(wèn)題的解決方案

    Android Studio 3.6運(yùn)行模擬器時(shí)Emulator警告問(wèn)題的解決方案

    這篇文章主要介紹了Android Studio 3.6運(yùn)行模擬器時(shí)Emulator警告問(wèn)題的解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Android實(shí)現(xiàn)兩臺(tái)手機(jī)屏幕共享和遠(yuǎn)程控制功能

    Android實(shí)現(xiàn)兩臺(tái)手機(jī)屏幕共享和遠(yuǎn)程控制功能

    在遠(yuǎn)程協(xié)助、在線教學(xué)、技術(shù)支持等多種場(chǎng)景下,實(shí)時(shí)獲得另一部移動(dòng)設(shè)備的屏幕畫(huà)面,并對(duì)其進(jìn)行操作,具有極高的應(yīng)用價(jià)值,本項(xiàng)目旨在實(shí)現(xiàn)兩臺(tái) Android 手機(jī)之間的屏幕共享與遠(yuǎn)程控制,需要的朋友可以參考下
    2025-04-04
  • Flutter Element概念簡(jiǎn)明分析

    Flutter Element概念簡(jiǎn)明分析

    Flutter 中 Element 作用的是作為中樞來(lái)管理和調(diào)度Widget和RenderObject,這里我們主要說(shuō)一下RenderObjectWidget 來(lái)主要說(shuō)一下Element 的生命周期,這里我刪除了一些assert 的方法,方便查看
    2023-04-04

最新評(píng)論

太谷县| 闻喜县| 大冶市| 韩城市| 无锡市| 略阳县| 聂荣县| 涡阳县| 蚌埠市| 马边| 抚顺市| 米脂县| 松桃| 玛多县| 湖州市| 宁明县| 两当县| 庆元县| 六盘水市| 游戏| 多伦县| 克拉玛依市| 星座| 靖远县| 桑植县| 安龙县| 冷水江市| 满洲里市| 昌都县| 循化| 四会市| 会昌县| 合江县| 车险| 延津县| 克拉玛依市| 高阳县| 永春县| 泰安市| 南靖县| 巴林左旗|