自定义控件之圆头像

先上代码:

package com.andy.oschina_android.widget;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;

public class CircleImageView extends View {

    private Paint mPaint;
    private RectF mBound;
    private Bitmap mImageBitmap;
    private float mRadius;

    public CircleImageView(Context context) {
        this(context,null);
    }

    public CircleImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mBound = new RectF();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int vw,vh;
        vw = vh =0;

        int iw,ih;
        if(mImageBitmap==null){
            iw = ih = 0;
        }else{
            iw = mImageBitmap.getWidth();
            ih = mImageBitmap.getHeight();
        }

        int size = Math.min(iw,ih);

        setMeasuredDimension(size,size);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        if(w!=oldw||h!=oldh){
            /**
             * 设置边界,剧中显示
             */
            int iw,ih;
            if(mImageBitmap==null){
                iw = ih = 0;
            }else{
                iw = mImageBitmap.getWidth();
                ih = mImageBitmap.getHeight();
            }

            int size = Math.min(getHeight(),getWidth());

            mBound.set(0,0,size,size);
            mRadius = size/2;

            if(mPaint.getShader()!=null){
                Matrix m = new Matrix();
                if(iw>ih){
                    m.setTranslate((iw-ih)/2,0);
                }else{
                    m.setTranslate(0,(ih-iw)/-2);
                }
                mPaint.getShader().setLocalMatrix(m);
            }
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if(mImageBitmap!=null) {
            canvas.drawRoundRect(mBound, mRadius, mRadius, mPaint);
        }
    }

    /**
     * 由图片决定View的大小
     * @param bitmap
     */
    public void setImageBitmap(Bitmap bitmap){
        if(bitmap!=mImageBitmap){
            mImageBitmap = bitmap;
            if(bitmap!=null) {
                BitmapShader bs = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
                mPaint.setShader(bs);
            }else{
                mPaint.setShader(null);
            }

            requestLayout();
        }
    }
}

效果图:

思路:

这里实现圆的方式是定义一个正方形的View,通过圆角(1/4圆)的方式实现

以上代码主要做了三件事:

1、测量view的大小

2、设定绘制编辑,设置偏移量

3、设置BitmapSharder

方法onMeasure()在测量view大小时被调用,在该方法中的末尾调用了setMeasuredDimension();,这个方法设置的高宽就是最终view的高宽。

在onSizeChanged()方法中根据图片的大小设置了矩形边界和圆角半径;同时创建一个Matrix,通过Matrix设置偏移量,最后把Matrix通过方法setLocalMatrix()设置给了BitmapShader对象,这里的BitmapShader对象就是setImageBitmap()方法中创建的。

onDraw()代码一目了然,就不在说了。

setImageBitmap()是自定义方法,用于将图片设置给view。在这个方法中主要干了两个事情,一是创建一个BitmapShader,用于存放图片的像素;二是请求重绘控件。

时间: 2024-10-05 04:34:12

自定义控件之圆头像的相关文章

让我的头像圆起来--Android之圆头像 .

在很多应用中,我们看到,个人主页里面的头像一般都是圆的,设计成圆的会使整个界面布局变的优雅漂亮.那么,怎么使头像变圆呢?有的人说可以在上面加一个中间为透明圆形的png图,用它来遮盖住头像不就行了嘛,但是png四周始终始终是不透明的,怎么做也达不到如下的效果图的. 下面我们讲讲怎么做成的吧. 首先创建一个继承ImageView的抽象类MaskedImage.让他重写onDraw方法.代码如下 public abstract class MaskedImage extends ImageView {

android自定义控件之圆形头像

一.自定义控件1 首先创建一个继承ImageView的抽象类MaskedImage.让他重写onDraw方法.代码如下 import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.Por

自定义控件 ------ 画圆+背景色

1 import android.content.Context; 2 import android.graphics.Canvas; 3 import android.graphics.Color; 4 import android.graphics.Paint; 5 import android.graphics.PaintFlagsDrawFilter; 6 import android.util.AttributeSet; 7 import android.widget.TextView

android 圆头像

通过自定义ImageView 实现 package com.example.yueyundong1.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Pain

登录圆形头像之网络加载与缓存到本地

Android开发中常常有用户头像显示,似乎大多数都是圆形显示,如果每次加载网络头像,会频繁的请求网络,所以本文主要说的是登录时的头像网络加载和缓存到本地,以便于下次加载时直接从本地获取即可. 效果图 自定义控件实现圆形头像显示请看, Android自定义ImageView实现图片圆形 ,椭圆和矩形圆角显示 这篇博客即可. 代码: public class MainActivity extends Activity implements OnClickListener { private Ima

美发帮--android APP开发实战

登陆界面,LinearLayout  ImageView  Button   用到了ImageView自动缩放,和自定义Button形状及State-Drawable,还用到了动画. 自定义控件之圆形头像,和自定义Toast 注册界面在验证手机号时,使用了一个CountDownTimer类,来完成倒计时验证.

简单的实现QQ通信功能(四)

第四部分:主界面的设计及代码 一:效果图及界面设计 1. 效果图: 2. 界面设计: (1)上面显示自己信息用一个PictureBox和两个Label,用来显示自己的头像和昵称备注名. (2)下面用了一个FlowLayoutPanel来显示好友列表,FlowDirection设置为TopDown,从上到下流式布局. (3)下面一个ComboBox用来选择自己的状态. (4)一个imageList3存放用户头像,根据登录者的头像代号进来选择需要的头像. (5)一个notifyIcon1来设置任务栏

2、列表item_圆头像_信息提示

1 import android.app.Activity; 2 import android.os.Bundle; 3 import android.view.LayoutInflater; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.widget.BaseAdapter; 7 import android.widget.ListView; 8 import android.widg

自定义控件 编辑和选取圆形头像

android大家都有很多需要用户上传头像的需求,有的是选方形,有的是圆角矩形,有的是圆形. 首先我们要做一个处理图片的自定义控件,把传入的图片,经过用户选择区域,处理成一定的形状. 有的app是通过在图片上画一个矩形区域表示选中的内容,有的则是通过双指放大缩小,拖动图片来选取图片.圆形头像,还是改变图片比较好 圆形区域可调节大小. 这个自定义View的图像部分分为三个,背景图片,半透明蒙层,和亮色区域--还是直接贴代码得了 package com.example.jjj.widget; imp