自定义画图形以及圆形头像的实现

说明:下面代码是自己定义画图,画的是手机最低端的四个Tab图标,例如微信中最底下的“微信” “通讯录” “发现” “我”这四个图标,还有颜色的渐变与切换。

            然后在layout布局中添加进去,怎么添加?例如我自己别的项目添加过的,这里为了举例,如下所示:

<com.项目名.view.MyTabIcon
        android:id="@+id/mti_main_data"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        myapp:icon_drawable="@drawable/tab_icon_message"
        myapp:icon_text="通讯录"
        android:onClick="onClick" />

--------------------------------------------------------------------------------------------------------------

public class MyTabIcon extends View{  //自己定义一个类MyTabIcon  继承View类

  int color;//颜色
    Drawable icon;//自定义view所使用的图案
    String text;//自定义view 的文本
    int textsize;//自定义文本的大小
    
    Paint drawPaint;//画图
    Paint textPaint;//画字
    
    Bitmap bitmap;//bitmap是从Drawable 转换过来的
    
    int alpha;//alpha的取值范围是0~255,它决定了画笔颜色的浓度
    public MyTabIcon(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context,attrs);
    initPaint();
    }

    private void initPaint() {
textPaint=new Paint();
textPaint.setTextSize(textsize);
textPaint.setStyle(Style.FILL);//写文字的画笔为实心

drawPaint=new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿

}


//读取用户在布局文件中设定的属性
    private void init(Context context, AttributeSet attrs) {
        //从一堆attrs属性中找出我们需要的
    TypedArray t=context.obtainStyledAttributes(attrs,R.styleable.MyTabIcon);
    icon=t.getDrawable(R.styleable.MyTabIcon_icon_drawable);
    //把icon 转成bitmap
    bitmap=((BitmapDrawable)icon).getBitmap();
    //把bitmap放大些,写true表示放大后做补偿,写false,表示性能优先不做补偿
    /**放大图片的大小,如bitmap.getWidth()*2,bitmap.getHeight()*2*/
    bitmap=Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), true);
   
    text=t.getString(R.styleable.MyTabIcon_icon_text);
    //getResources().getDisplayMetrics()获取屏幕密度,下面是将sp转为像素
    textsize=t.getDimensionPixelSize(R.styleable.MyTabIcon_icon_text_size, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 11, getResources().getDisplayMetrics()));
   color=t.getColor(R.styleable.MyTabIcon_icon_color, Color.GREEN);
        t.recycle();
    }


    //用onDraw方法画出四个标签:喵信、喵友、喵圈、设置
    //若给画笔添加颜色,就可以设置切换标签的时候,标签本身颜色的渐变
    //当前标签有绿色渐变为灰色,下一个标签由灰色变绿色
    @Override
    protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    float left=getWidth()/2-bitmap.getWidth()/2;
float top=getHeight()/2-bitmap.getHeight()/2-10;//减10,是画的图片往上挪10个像素开始画
//绘制图标(用灰色绘制)
    canvas.drawBitmap(bitmap, left, top, null);//null写成drawPaint是什么效果呢???
   
    Rect bounds=new Rect();//矩形
textPaint.getTextBounds(text, 0, text.length(), bounds);
    float x=getWidth()/2-bounds.width()/2;
float y=getHeight()/2+bitmap.getHeight()/2+bounds.height()-10;
textPaint.setColor(Color.GRAY);
//绘制文字

    canvas.drawText(text, x, y, textPaint);
   
    //利用alpha,进行文字的彩色(绿色)绘制
    drawColorText(canvas,x,y,alpha);
    //利用alpha,进行图标的彩色(绿色)绘制
    drawColorBitmap(canvas,left,top,alpha);
    }
    
    private void drawColorBitmap(Canvas canvas, float left, float top,
int alpha2) {
// 先创建一副空白的图,多宽多高,格式等
    Bitmap bm=Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),Bitmap.Config.ARGB_8888);
    Canvas myCanvas=new Canvas(bm);//自己创建一个canvas用来画带颜色的图,myCanvas只会画在bm上,不会画在屏幕上
    myCanvas.drawBitmap(bitmap, 0,0,null);
   
    //Mode.SRC_IN,两者相交的区域呈现绿色
    drawPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    drawPaint.setColor(color);
    drawPaint.setAlpha(alpha2);//颜色浓度
    //画一个纯色区域(方块),方块为纯色(如纯绿色,纯蓝色)
    RectF rect=new RectF(0, 0, bm.getWidth(), bm.getHeight());
//用画笔画一个矩形区域,画笔drawpaint上设置画笔的颜色,浓度,以及模式
    myCanvas.drawRect(rect, drawPaint);
   
    //将绿色的图bm画到屏幕上,覆盖灰色的图,用canvas来画
canvas.drawBitmap(bm, left, top, null);//把带颜色的纯绿色的图bm盖在灰色图上,两者交叉的部分为绿色

}


private void drawColorText(Canvas canvas, float x, float y, int alpha2) {
textPaint.setColor(color);
textPaint.setAlpha(alpha2);
canvas.drawText(text, x, y,textPaint);

}


    //滑的过程中,一直在调用setTabIconAlpha()方法,这个方法干两件事,
    //一,alpha的值一直变化,this.alpha=alpha;
    //二,每调用一次setTabIconAlpha()会执行invalidate(),invalidate()方法会调用onDraw方法
    //这样把变化的alpha传给onDraw()去画文字,随着alpha的值增大,滑动的页面的文字颜色变浅,而即将进入的页面的文字越来越深
public void setTabIconAlpha(int alpha){
    this.alpha=alpha;
    invalidate();//重画,重复调用一次onDraw方法,如果直接调onDraw(canvas);画出来的要不超大要不超小
   
   
    }

}


圆形头像的实现——

/**
 * 实现里圆形头像的处理
 */
public class ImageManager {
    /**
     *
     * @param context
     * @param bitmap 需要进行格式化的头像
     * @return
     */
    public static Bitmap formatBitmap( Context context,Bitmap bitmap){
        //获得原始头像的宽度和高度
        int width=bitmap.getWidth();
        int height=bitmap.getHeight();


        //创建一个画布的背景图片
        Bitmap backBitmap=Bitmap.createBitmap(width,height,
                Bitmap.Config.ARGB_8888);
        //创建一个画布
        Canvas canvas=new Canvas(backBitmap);


        //创建一个画笔
        Paint paint=new Paint();
        //设置抗锯齿
        paint.setAntiAlias(true);
        //设置画笔的颜色
        paint.setColor(Color.BLACK);


        //计算圆的半径
        int radius=Math.min(width,height)/2;
        canvas.drawCircle( width/2, height/2, radius,paint);//先画圆
        //设置画笔的模式
        paint.setXfermode( new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap,0,0,paint);//再画方形头像,覆盖在圆形上,取交集


        //设置画笔的颜色
        paint.setColor(Color.WHITE);
        //设置画出来的圆的样式
        paint.setStyle(Paint.Style.STROKE);


        //计算一下圆环的宽度
        float strokeWidth= TypedValue. applyDimension(
                TypedValue.COMPLEX_UNIT_DIP,2,context.getResources().getDisplayMetrics());
        //设置圆环边线的粗细
        paint.setStrokeWidth(strokeWidth);
        canvas.drawCircle(width/2,height/2, radius-strokeWidth/2,paint);

        return backBitmap;
    }

}


在哪里使用这个画圆形头像的类呢?

在适配中,ImageView控件设置头像处设置圆形头像,如:

          //根据头像Id获得联系人的头像的信息
            Bitmap photo= ContactsManager.
                    getPhotoByPhotoId(context, contact.getPhotoId());
            //对象进行圆形的格式化

            photo= ImageManager. formatBitmap(context,photo);

            //根据格式好的圆形头像,把它设置到ImageView控件上

            holder.imageView_Header. setImageBitmap(photo);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值