【Android 界面效果44】Android之圆头像实例

十度 Android 2015年12月02日 收藏

在很多应用中,我们看到,个人主页里面的头像一般都是圆的,设计成圆的会使整个界 面布 局变的优雅漂亮。那么,怎么使头像变圆呢?有的人说可以在上面加一个中间为透明圆形的png图,用它来遮盖住头像不就行了嘛,但是png四周始终始终是不 透明的,怎么做也达不到如下的效果图的。

 

 下面我们讲讲怎么做成的吧。

 首先创建一个继承ImageView的抽象类MaskedImage。让他重写onDraw方法。代码如下

 

  1. public abstract class MaskedImage extends ImageView {
  2. private static final Xfermode MASK_XFERMODE;
  3. private Bitmap mask;
  4. private Paint paint;
  5. static {
  6. PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;
  7. MASK_XFERMODE = new PorterDuffXfermode(localMode);
  8. }
  9. public MaskedImage(Context paramContext) {
  10. super(paramContext);
  11. }
  12. public MaskedImage(Context paramContext, AttributeSet paramAttributeSet) {
  13. super(paramContext, paramAttributeSet);
  14. }
  15. public MaskedImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {
  16. super(paramContext, paramAttributeSet, paramInt);
  17. }
  18. public abstract Bitmap createMask();
  19. protected void onDraw(Canvas paramCanvas) {
  20. Drawable localDrawable = getDrawable();
  21. if (localDrawable == null)
  22. return;
  23. try {
  24. if (this.paint == null) {
  25. Paint localPaint1 = new Paint();
  26. this.paint = localPaint1;
  27. this.paint.setFilterBitmap(false);
  28. Paint localPaint2 = this.paint;
  29. Xfermode localXfermode1 = MASK_XFERMODE;
  30. @SuppressWarnings("unused")
  31. Xfermode localXfermode2 = localPaint2.setXfermode(localXfermode1);
  32. }
  33. float f1 = getWidth();
  34. float f2 = getHeight();
  35. int i = paramCanvas.saveLayer(0.0F, 0.0F, f1, f2, null, 31);
  36. int j = getWidth();
  37. int k = getHeight();
  38. localDrawable.setBounds(0, 0, j, k);
  39. localDrawable.draw(paramCanvas);
  40. if ((this.mask == null) || (this.mask.isRecycled())) {
  41. Bitmap localBitmap1 = createMask();
  42. this.mask = localBitmap1;
  43. }
  44. Bitmap localBitmap2 = this.mask;
  45. Paint localPaint3 = this.paint;
  46. paramCanvas.drawBitmap(localBitmap2, 0.0F, 0.0F, localPaint3);
  47. paramCanvas.restoreToCount(i);
  48. return;
  49. } catch (Exception localException) {
  50. StringBuilder localStringBuilder = new StringBuilder()
  51. .append("Attempting to draw with recycled bitmap. View ID = ");
  52. System.out.println("localStringBuilder=="+localStringBuilder);
  53. }
  54. }
  55. }

 

 

 

 然后新建一个类CircularImage继承MaskedImage。代码如下:

  1. public class CircularImage extends MaskedImage {
  2. public CircularImage(Context paramContext) {
  3. super(paramContext);
  4. }
  5. public CircularImage(Context paramContext, AttributeSet paramAttributeSet) {
  6. super(paramContext, paramAttributeSet);
  7. }
  8. public CircularImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {
  9. super(paramContext, paramAttributeSet, paramInt);
  10. }
  11. public Bitmap createMask() {
  12. int i = getWidth();
  13. int j = getHeight();
  14. Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;
  15. Bitmap localBitmap = Bitmap.createBitmap(i, j, localConfig);
  16. Canvas localCanvas = new Canvas(localBitmap);
  17. Paint localPaint = new Paint(1);
  18. localPaint.setColor(-16777216);
  19. float f1 = getWidth();
  20. float f2 = getHeight();
  21. RectF localRectF = new RectF(0.0F, 0.0F, f1, f2);
  22. localCanvas.drawOval(localRectF, localPaint);
  23. return localBitmap;
  24. }
  25. }

 

 

 新建一个MainActivity,代码如下:

 

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. CircularImage cover_user_photo = (CircularImage) findViewById(R.id.cover_user_photo);
  7. cover_user_photo.setImageResource(R.drawable.face);
  8. }
  9. }

 

 

 其XML布局文件为: 

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:gravity="center" >
  6. <ImageView
  7. android:layout_width="82.0dip"
  8. android:layout_height="82.0dip"
  9. android:layout_centerInParent="true"
  10. android:contentDescription="@null"
  11. android:src="@drawable/me_head_bg" />
  12. <com.doublefi123.diary.widget.CircularImage
  13. android:id="@+id/cover_user_photo"
  14. android:layout_width="74.0dip"
  15. android:layout_height="74.0dip"
  16. android:layout_centerInParent="true" />
  17. </RelativeLayout>

 

 

源码在此:http://download.csdn.net/detail/dongdong230/8428989 (免费奉献源码)