**
在Android开发中,想要实现绚丽的效果,仅仅依赖于系统提供的控件是无法满足的,于是便产生了自定义View。
自定义View主要分为四类,第一种是通过继承View,然后重写View的onDraw方法,这种方式主要用于一些不规则的效果,第二种是继承ViewGroup派生特定的Layout,这种方式主要用于自定义的布局。第三种主要是继承特定的View,如TextView等,一般用于根据自己的业务扩展系统空间的功能,第四类是继承ViewGroup,这种方式主要是实现自定义布局,能做出具有组件形式的自定义View;本文主要针对第一种方式进行讲解,
第一步是创建自己的View继承View类,然后重写View类的构造方法和onDraw方法,自定义view需要个Paint对象,然后在View个构造方法在对Paint对象的相关参数进行设置,然后在onDraw中进行绘制,以下是个简单的例子
public class MyView extends View {
private int mColor = Color.BLUE;
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
public MyView(Context context) {
super(context);
init();
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
mPaint.setColor(mColor);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int paddingLeft = getPaddingLeft();
int paddingRight = getPaddingRight();
int paddingTop = getPaddingTop();
int paddingBottom = getPaddingBottom();
int width = getWidth() - paddingLeft - paddingRight;
int height = getHeight() - paddingBottom - paddingTop;
int radius = Math.min(width,height) / 2;
canvas.drawCircle(paddingLeft + width / 2,paddingTop + height / 2,radius,mPaint);
}
自定义View的使用和系统的控件无异,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.a16770.myexample.MainActivity">
<com.example.a16770.myexample.MyView
android:id="@+id/Ws"
android:layout_width="wrap_content"
android:layout_marginLeft="30dp"
android:paddingTop="100dp"
android:background="#fff0"
android:layout_height="60dp" />
</LinearLayout>**