35.自定义控件的属性、皮肤和视图
1.下载素材。
本节素材源码,请在公众号回复" AS12181 "。
2.新建MyView。
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyView);
int color = ta.getColor(R.styleable.MyView_view_color, 0xffff0000);
setBackgroundColor(color);
ta.recycle();
}
}
3.在values下新建attrs.xml。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView">
<attr name="view_color" format="color"/>
</declare-styleable>
</resources>
4.在drawable下,新建button_skin.xml。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="false" android:drawable="@drawable/btn_normal"></item>
<item android:state_pressed="true" android:drawable="@drawable/btn_pressed"></item>
</selector>
5.新建RotateView。
public class RotateView extends View {
private Paint p;
private float degrees = 0;
public RotateView(Context context) {
super(context);
initProperties();
}
public RotateView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initProperties();
}
public RotateView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initProperties();
}
private void initProperties(){
p = new Paint();
p.setColor(Color.RED);
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
canvas.save();
canvas.translate(300, 300);
canvas.rotate(degrees, 50, 50);
canvas.drawRect(0, 0, 100, 100, p);
degrees ++;
canvas.restore();
invalidate();
}
}
6.修改activity_main.xml。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:jsz="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:text="自定义控件属性" />
<jsz.nopi.firstapp.MyView
jsz:view_color="@color/colorPrimary"
android:layout_width="200dp"
android:layout_height="200dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:text="自定义控件皮肤" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="自定义控件皮肤"
android:background="@drawable/button_skin"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:text="自定义控件" />
<jsz.nopi.firstapp.RotateView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>