android 实现图片的圆角


获取圆角位图的方主要的原理是,先画一个圆角矩形,然后设置画笔Porter-Duff规则的Mode.SRC_IN来控制Paint与已有的Canvas图像进行交互,即取两层绘制交集。显示上层。

运行效果图如下:


 

主要代码如下:

packagecom.example.roundedcornerbitmap;

 

importandroid.os.Bundle;

importandroid.app.Activity;

importandroid.graphics.Bitmap;

importandroid.graphics.Bitmap.Config;

importandroid.graphics.Canvas;

importandroid.graphics.Paint;

importandroid.graphics.PorterDuff.Mode;

importandroid.graphics.PorterDuffXfermode;

importandroid.graphics.Rect;

importandroid.graphics.RectF;

import android.graphics.drawable.BitmapDrawable;

importandroid.graphics.drawable.Drawable;

importandroid.view.Menu;

importandroid.widget.ImageView;

 

public classMainActivity extends Activity

{

    ImageView originalImage;//原图

    ImageView roundedCornerImage;//变成圆角显示后的图

      @Override

      protected void onCreate(BundlesavedInstanceState)

      {

           super.onCreate(savedInstanceState);

           setContentView(R.layout.activity_main);

           originalImage=(ImageView)findViewById(R.id.originalImage);

           roundedCornerImage=(ImageView) findViewById(R.id.RoundedCornerImage);

           originalImage.setImageResource(R.drawable.me);//设置原图

           Drawable drawable =getResources().getDrawable(R.drawable.me); //得到drawable图片

           Bitmapbitmap=drawableToBitmap(drawable); //将drawable转换成bitmap

           roundedCornerImage.setImageBitmap(toRoundCorner(bitmap,10));//将bitmap处理后设置到imageView

      }

 

      @Override

      public boolean onCreateOptionsMenu(Menumenu)

      {

          

           getMenuInflater().inflate(R.menu.main,menu);

           return true;

      }

       /**

     * 获取圆角位图的方法 主要的原理是,先画一个圆角矩形,然后设置画笔Porter-Duff规则的Mode.SRC_IN来控制Paint与已有的Canvas图像进行交互

     * 即取两层绘制交集。显示上层。

     * @param bitmap 需要转化成圆角的位图

     * @param roundPx 圆角的度数,数值越大,圆角越大

     * @return 处理后的圆角位图

     */ 

    public Bitmap toRoundCorner(Bitmap bitmap, float roundPx)

    { 

           // 新建一个新的输出图片

        Bitmap output =Bitmap.createBitmap(bitmap.getWidth(), 

                bitmap.getHeight(),Config.ARGB_8888);

        //得到画布

        Canvas canvas = newCanvas(output); 

     

        //得到与图像相同大小的区域  由构造的四个值决定区域的位置以及大小

        Rect rect = new Rect(0, 0,bitmap.getWidth(), bitmap.getHeight()); 

        RectF rectF = new RectF(rect);  // 新建一个矩形

        int color = 0xff424242; //这个颜色可以随便取

        //初始化画笔

        Paint paint = new Paint(); 

        paint.setAntiAlias(true);     //设置抗锯齿

        canvas.drawARGB(0, 0, 0, 0);  //绘制透明色,便于后面取圆角矩形和bitmap的交集

        paint.setColor(color);

        //drawRoundRect的第2,3个参数分别为x方向上的圆角半径,和y方向上的圆角半径。

        //画一个圆角矩形

        canvas.drawRoundRect(rectF, roundPx,roundPx, paint); 

       //PorterDuff.Mode.SRC_IN  取两层绘制交集。显示上层。

        paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));

        //取圆角矩形和bitmap的交集显示bitmap

        canvas.drawBitmap(bitmap, rect, rect,paint); 

        return output; //返回处理后的bitmap

    }

    /**

     * @param drawable  需要转换的Drawable

     * @return 转变后的Bitmap

     */

    public Bitmap drawableToBitmap(Drawabledrawable)

    {

           

         BitmapDrawable bitmapDrawable =(BitmapDrawable) drawable; 

         Bitmap bitmap =bitmapDrawable.getBitmap(); 

         return bitmap;

    }

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值