首先我们需要一个圆形的图片,但是不可能美工把所有的图片都给你处理,那么我们就需要自己定义了.
首先我们需要在建一个class集成ImageView,然后重写其构造方法,这里我们重写其2个参数的构造方法,
在res/values/ 下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。
public class CircleView extends ImageView{
public CircleView(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
//*onMeasure()//初步确定控件尺寸 ...一般不建议重写
//*onLayout()//决定子控件如何的摆放
//onDraw()
attrs.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CircleView">
<attr name="border_width" format="dimension"></attr>
<attr name="border_color" format="color"></attr>
</declare-styleable>
</resources>
在我们的activity_main.xml中添加我们的自定义View
下面红色部分是它的命名空间 res/后是我们的包名
这样才能在其属性中添加(因为用的是eclipse,有时候不会自动提示,这时你可以重启一下你的eclipse ,这样就可以自动提示出来了)
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:apple="http://schemas.android.com/apk/res/com.example.myviewdemo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<com.example.myviewdemo.CircleView
android:id="@+id/cv"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_centerInParent="true"
android:src="@drawable/ic_launcher"
apple:border_width="2dp"
apple:border_color="#ff00ff00"
></com.example.myviewdemo.CircleView>
</RelativeLayout>
再重写其中的setImageBitmap方法
/**
* 改写ImageView默认的setImageBitmap方法
*/
@Override
public void setImageBitmap(Bitmap bm) {
//bm---xfermode--->bitmap
Bitmap bitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLACK);
float radius = Math.min(bm.getWidth(), bm.getHeight())/2;
canvas.drawCircle(bm.getWidth()/2, bm.getHeight()/2, radius , paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bm, 0, 0, paint);
paint.setStyle(Style.STROKE);
paint.setStrokeWidth(borderWidth);
paint.setColor(borderColor);
canvas.drawCircle(bm.getWidth()/2, bm.getHeight()/2, radius-borderWidth/2, paint);
setScaleType(ScaleType.FIT_CENTER);
super.setImageBitmap(bitmap);
}
虽然上面都做好了,但是系统还是不知道我们的属性:我们还需要在自定义View里面添加其属性:
public CircleView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray t = context.obtainStyledAttributes(attrs, R.styleable.CircleView);
borderWidth = t.getDimensionPixelSize(R.styleable.CircleView_border_width, 0);
borderColor = t.getColor(R.styleable.CircleView_border_color, Color.WHITE);
t.recycle();
}
OK!上面的做好了你只要在MainActivity中初始化一下我们的控件,给其指定一个别的图片就可以了..
CircleView cv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cv = (CircleView) findViewById(R.id.cv);
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.b);
cv.setImageBitmap(bm);
}
这里还需要注意一点,,,那就是我们没有对Bitmap进行压缩,所以在模拟器上运行的同学选择图片的时候不要选择大图片,那样容易出现:
1,OOM OutOfMemory 内存溢出;
2,显示出来了但还是之前的样式矩形图片....
以上就是我总结的一些基础吧,希望对大家有所帮助!