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



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

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

  1. public abstract class MaskedImage extends ImageView {      private static final Xfermode MASK_XFERMODE;      private Bitmap mask;      private Paint paint;        static {          PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;          MASK_XFERMODE = new PorterDuffXfermode(localMode);      }        public MaskedImage(Context paramContext) {          super(paramContext);      }        public MaskedImage(Context paramContext, AttributeSet paramAttributeSet) {          super(paramContext, paramAttributeSet);      }        public MaskedImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {          super(paramContext, paramAttributeSet, paramInt);      }        public abstract Bitmap createMask();        protected void onDraw(Canvas paramCanvas) {          Drawable localDrawable = getDrawable();          if (localDrawable == null)              return;          try {              if (this.paint == null) {                  Paint localPaint1 = new Paint();                  this.paint = localPaint1;                  this.paint.setFilterBitmap(false);                  Paint localPaint2 = this.paint;                  Xfermode localXfermode1 = MASK_XFERMODE;                  @SuppressWarnings("unused")                  Xfermode localXfermode2 = localPaint2.setXfermode(localXfermode1);              }              float f1 = getWidth();              float f2 = getHeight();              int i = paramCanvas.saveLayer(0.0F, 0.0F, f1, f2, null, 31);              int j = getWidth();              int k = getHeight();              localDrawable.setBounds(0, 0, j, k);              localDrawable.draw(paramCanvas);              if ((this.mask == null) || (this.mask.isRecycled())) {                  Bitmap localBitmap1 = createMask();                  this.mask = localBitmap1;              }              Bitmap localBitmap2 = this.mask;              Paint localPaint3 = this.paint;              paramCanvas.drawBitmap(localBitmap2, 0.0F, 0.0F, localPaint3);              paramCanvas.restoreToCount(i);              return;          } catch (Exception localException) {              StringBuilder localStringBuilder = new StringBuilder()                      .append("Attempting to draw with recycled bitmap. View ID = ");              System.out.println("localStringBuilder=="+localStringBuilder);          }      }  }
  1. public abstract class MaskedImage extends ImageView {      private static final Xfermode MASK_XFERMODE;      private Bitmap mask;      private Paint paint;        static {          PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;          MASK_XFERMODE = new PorterDuffXfermode(localMode);      }        public MaskedImage(Context paramContext) {          super(paramContext);      }        public MaskedImage(Context paramContext, AttributeSet paramAttributeSet) {          super(paramContext, paramAttributeSet);      }        public MaskedImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {          super(paramContext, paramAttributeSet, paramInt);      }        public abstract Bitmap createMask();        protected void onDraw(Canvas paramCanvas) {          Drawable localDrawable = getDrawable();          if (localDrawable == null)              return;          try {              if (this.paint == null) {                  Paint localPaint1 = new Paint();                  this.paint = localPaint1;                  this.paint.setFilterBitmap(false);                  Paint localPaint2 = this.paint;                  Xfermode localXfermode1 = MASK_XFERMODE;                  @SuppressWarnings("unused")                  Xfermode localXfermode2 = localPaint2.setXfermode(localXfermode1);              }              float f1 = getWidth();              float f2 = getHeight();              int i = paramCanvas.saveLayer(0.0F, 0.0F, f1, f2, null, 31);              int j = getWidth();              int k = getHeight();              localDrawable.setBounds(0, 0, j, k);              localDrawable.draw(paramCanvas);              if ((this.mask == null) || (this.mask.isRecycled())) {                  Bitmap localBitmap1 = createMask();                  this.mask = localBitmap1;              }              Bitmap localBitmap2 = this.mask;              Paint localPaint3 = this.paint;              paramCanvas.drawBitmap(localBitmap2, 0.0F, 0.0F, localPaint3);              paramCanvas.restoreToCount(i);              return;          } catch (Exception localException) {              StringBuilder localStringBuilder = new StringBuilder()                      .append("Attempting to draw with recycled bitmap. View ID = ");              System.out.println("localStringBuilder=="+localStringBuilder);          }      }  }

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

  1. public class CircularImage extends MaskedImage {      public CircularImage(Context paramContext) {          super(paramContext);      }        public CircularImage(Context paramContext, AttributeSet paramAttributeSet) {          super(paramContext, paramAttributeSet);      }        public CircularImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {          super(paramContext, paramAttributeSet, paramInt);      }        public Bitmap createMask() {          int i = getWidth();          int j = getHeight();          Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;          Bitmap localBitmap = Bitmap.createBitmap(i, j, localConfig);          Canvas localCanvas = new Canvas(localBitmap);          Paint localPaint = new Paint(1);          localPaint.setColor(-16777216);          float f1 = getWidth();          float f2 = getHeight();          RectF localRectF = new RectF(0.0F, 0.0F, f1, f2);          localCanvas.drawOval(localRectF, localPaint);          return localBitmap;      }  }

新建一个MainActivity,代码如下:

public class MainActivity extends Activity {        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);                    CircularImage cover_user_photo = (CircularImage) findViewById(R.id.cover_user_photo);          cover_user_photo.setImageResource(R.drawable.face);      }  }

其XML布局文件为:

  1.                     
  1.                     


更多相关文章

  1. Android实用视图动画及工具系列之八:带头部的Viewpaper,结合头部的
  2. [置顶] Android中webview里js和java的相互调用--含代码demo解析
  3. Data Binding Guide——google官方文档翻译(上)
  4. android 自定义复合控件
  5. Android微信支付快速集成案例及有效解决返回值-1
  6. Android自动化单元测试(上)
  7. Android中GridView拖拽的效果【android进化三十六】
  8. Android仿360卫士布局风格
  9. 学习android, 自己编的一个黑白棋游戏 (提供源代码下载)

随机推荐

  1. 资料描述Android依赖注入:Google Guice on
  2. Android开发FAQ
  3. [置顶] 在android 4.0 上面移植camera的
  4. 跟Google学写代码:Android运行时权限处理
  5. Android API Guides---App Manifest
  6. Android之Button按钮点击事件的四种方式
  7. Android 完美解决自定义preference与Acti
  8. Android中关于签名的一些知识
  9. mac zsh 配置 adb 环境变量 “zsh: comma
  10. Android(安卓)jni开发 eclipse 删除额外