框架學習六 帶邊框的圓形頭像

2021-06-26 04:52:45 字數 3630 閱讀 9580

1、上效果圖

3、用法:

先說缺點:只能在xml中用src屬性有效。用**動態定義控制項無效。

就說一點吧,因為用到自定義屬性,所以需引用自定義的xmlns:

如果沒有此句,則會報錯:error: error parsing xml: unbound prefix。

對於該控制項用法:

<?xml version="1.0" encoding="utf-8"?>

package de.hdodenhof.circleimageview.sample;

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;

public class circleimageview extends imageview

public circleimageview(context context, attributeset attrs)

public circleimageview(context context, attributeset attrs, int defstyle)

} @override

public scaletype getscaletype()

@override

public void setscaletype(scaletype scaletype)

} @override

protected void ondraw(canvas canvas)

canvas.drawcircle(getwidth() / 2, getheight() / 2, mborderradius, mborderpaint);

} @override

protected void onsizechanged(int w, int h, int oldw, int oldh)

public int getbordercolor()

public void setbordercolor(int bordercolor)

mbordercolor = bordercolor;

mborderpaint.setcolor(mbordercolor);

invalidate();

} public int getborderwidth()

public void setborderwidth(int borderwidth)

mborderwidth = borderwidth;

setup();

} @override

public void setimagebitmap(bitmap bm)

@override

public void setimagedrawable(drawable drawable)

@override

public void setimageresource(int resid)

private bitmap getbitmapfromdrawable(drawable drawable)

if (drawable instanceof bitmapdrawable)

try else

canvas canvas = new canvas(bitmap);

drawable.setbounds(0, 0, canvas.getwidth(), canvas.getheight());

drawable.draw(canvas);

return bitmap;

} catch (outofmemoryerror e)

} private void setup()

if (mbitmap == null)

mbitmapshader = new bitmapshader(mbitmap, shader.tilemode.clamp, shader.tilemode.clamp);

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() else

mshadermatrix.setscale(scale, scale);

mshadermatrix.posttranslate((int) (dx + 0.5f) + mborderwidth, (int) (dy + 0.5f) + mborderwidth);

mbitmapshader.setlocalmatrix(mshadermatrix);

}}

帶邊框 Border 的LinearLayout

先看一下這樣乙個簡單的布局,所展示的內容很少,上下兩條分割線,兩個文字。1.普通做法 2.將分割線view定義在border.xml裡面,通過include引入。3.將兩條線放到.9中。4.自定義linearlayout將分割線定義為屬性。public class borderlinearlayou...

框架學習六 ViewPagerIndicator

一 是什麼 看效果圖 即viewpager的分頁指示器,比如很多應用的指引介面,下面的小圓點,還有一些應用上面的tab等,viewpagerindicator都能很好的實現。支援的最高版本 api16。當然可更改。注意 如果新建的專案下包含android support v4.jar,你要將其刪除,...

帶選單的無邊框窗體

帶選單的無邊框窗體 前幾天做了乙個窗體,是無邊框的,可是在我加了一些右鍵選單後,窗體的邊框就出來了,很是糾結。後來就上網查了一些資料,終於把邊框去掉了,甚至是邊框處的黑色框線。現在拿出來曬曬。繼續前一篇的文章自定義形狀窗體,把窗體做成自定義的的形狀後,這時,你進行選單編輯後,可能窗體邊框就又回來了,...