<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Fresco是FaceBook開源的Android平臺圖片載入庫,可以從網路,從本地檔案系統,本地資源載入圖片
Fresco本身已經實現了圓角以及圓形圖片的功能。
<!--圓形圖片,一般用作頭像--> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/iv_avatar" android:layout_width="40dp" android:layout_height="40dp" app:placeholderImage="@drawable/ic_avatar_default" app:roundAsCircle="true"/>
<!--圓角圖片,為了美觀大多數圖片都會有這樣的處理。--> <!--當圖片為正方形的時候,將roundedCornerRadius設定為邊長的一半,也可以形成圓形圖片的效果--> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/iv_avatar" android:layout_width="40dp" android:layout_height="40dp" app:placeholderImage="@drawable/ic_avatar_default" app:roundedCornerRadius="5dp"/>
工作中,遇到圓形頭像的時候,UI通常會給我們這樣一張圖作為預設圖片
理論上來講,只需要加入下列這行程式碼,就可以完成這部分工作了
app:placeholderImage="@drawable/ic_avatar_default"
然而圓形圖片本身已經是圓形的了,在有些機型上就出現了這個樣式。
搜尋了一波,自帶的屬性都不能解決這個問題,乾脆自己來定義這個圓形的實現吧,同時Fresco自帶的圓角效果只能保證使用統一的半徑,想要讓四個圓角的半徑不同,只能在java檔案中設定,不夠靈活,定義圓角半徑的屬性也需要做些變更。
思路:自定義RoundImageView繼承自 SimpleDraweeVie,具備其所有的功能。
Canvas的clipPath(Path path)可以根據Path,將Canvas剪裁成我們想要的圖形。
public class RoundImageView extends SimpleDraweeView { private final static int DEFAULT_VALUE = 0; private float mWidth; private float mHeight; private Path mPath; // 圓角角度 private float mCornerRadius; // 左上角圓角角度 private float mLeftTopRadius; // 右上角圓角角度 private float mRightTopRadius; // 右下角圓角角度 private float mRightBottomRadius; // 左下角圓角角度 private float mLeftBottomRadius; // 是否使用圓形圖片 private boolean mAsCircle; // 圓形圖片半徑 private float mRadius; public RoundImageView(Context context) { this(context, null); } public RoundImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RoundImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initData(); initAttrs(context, attrs); } private void initData() { mPath = new Path(); } private void initAttrs(Context context, AttributeSet attrs) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundImageView); mCornerRadius = typedArray.getDimension(R.styleable.RoundImageView_cornerRadius, DEFAULT_VALUE); mAsCircle = typedArray.getBoolean(R.styleable.RoundImageView_asCircle, false); if (mCornerRadius <= 0) { // 說明使用者沒有設定四個圓角的有效值,此時四個圓角各自使用自己的值 mLeftTopRadius = typedArray.getDimension(R.styleable.RoundImageView_leftTopRadius, DEFAULT_VALUE); mRightTopRadius = typedArray.getDimension(R.styleable.RoundImageView_rightTopRadius, DEFAULT_VALUE); mRightBottomRadius = typedArray.getDimension(R.styleable.RoundImageView_rightBottomRadius, DEFAULT_VALUE); mLeftBottomRadius = typedArray.getDimension(R.styleable.RoundImageView_leftBottomRadius, DEFAULT_VALUE); } else { // 使用了統一的圓角,因此使用mCornerRadius統一的值 mLeftTopRadius = mCornerRadius; mRightTopRadius = mCornerRadius; mRightBottomRadius = mCornerRadius; mLeftBottomRadius = mCornerRadius; } typedArray.recycle(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); mWidth = getWidth(); mHeight = getHeight(); // 如果開啟了圓形標記 if (mAsCircle) { mRadius = Math.min(mWidth / 2, mHeight / 2); } } @Override protected void onDraw(Canvas canvas) { // 如果開啟了圓形標記,圓形圖片的優先順序高於圓角圖片 if(mAsCircle) { drawCircleImage(canvas); } else { drawCornerImage(canvas); } super.onDraw(canvas); } /** * 畫中間圓形 * @param canvas */ private void drawCircleImage(Canvas canvas) { mPath.addCircle(mWidth / 2, mHeight / 2, mRadius, Path.Direction.CW); canvas.clipPath(mPath); } /** * 畫圓角 * @param canvas */ private void drawCornerImage(Canvas canvas) { if (mWidth > mCornerRadius && mHeight > mCornerRadius) { // 設定四個角的x,y半徑值 float[] radius = {mLeftTopRadius, mLeftTopRadius, mRightTopRadius, mRightTopRadius, mRightBottomRadius, mRightBottomRadius, mLeftBottomRadius, mLeftBottomRadius}; mPath.addRoundRect(new RectF(0,0, mWidth, mHeight), radius, Path.Direction.CW); canvas.clipPath(mPath); } } }
attr屬性如下
<!--適配android10的圖片控制元件--> <declare-styleable name="RoundImageView"> <!--圓形圖片--> <attr name="asCircle" format="boolean"/> <!--左上角圓角半徑--> <attr name="leftTopRadius" format="dimension"/> <!--右上角圓角半徑--> <attr name="rightTopRadius" format="dimension"/> <!--右下角圓角半徑--> <attr name="rightBottomRadius" format="dimension"/> <!--左下角圓角半徑--> <attr name="leftBottomRadius" format="dimension"/> <!--四個圓角半徑,會覆蓋上邊四個圓角值--> <attr name="cornerRadius" format="dimension"/> </declare-styleable>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45