概述
-----自定义View的步骤---:
1.写一个类继承View;在类中实现各种方法
2.在xml布局中使用自定义的控件,必须要写全路径,并且使用属性时需要申明命名空间;
3.在res/values下创建atts.xml--声明给那个view添加自定义属性,
4.实现这个构造方法,在这里面吧属性解析出来:
public AutodefineButton(Context context, @Nullable AttributeSet attrs)
public class AutodefineButton extends View {
/*
* 作为背景的图片
* */
private Bitmap backgroundBitmap;
/*
* 可以滑动的图片
* */
private Bitmap slideBtn;
/*
* 画笔
* */
private Paint paint;
//在代码里创建对象的时候调用此方法
public AutodefineButton(Context context) {
super(context);
}
/*在布局中申明的view,自动调用此方法-----必须有此方法否则会报错
*
*attrs----对xml解析后的属性集合
* */
public AutodefineButton(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
/*TypedArray是对AttributeSet中的原始数据安照图纸中(R.styleable.AutodefineButton实际上就是图纸)的申明类型创建出具体的对象
*
* */
TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.AutodefineButton);
int taCount=ta.getIndexCount();//获得被加工过的对象的个数;----被使用的对象个数
for(int i=0;i<taCount;i++){
int index=ta.getIndex(i);//属性的id
switch (index){
case AutodefineButton.test_msg:
String msg=ta.getString(index);//根据id的值取出属性值
break;
}
}
initview();
}
public AutodefineButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//初始化图片
private void initview() {
backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.abc_btn_default_mtrl_shape);
//初始化画笔
paint = new Paint();
paint.setAntiAlias(true);//打开抗锯齿
//添加事件点击的监听----------如果是有拖动手势的时候,需要禁止点击事件的发生(可以点击了,但是里面不执行相关操作)
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
/*view显示在屏幕上的几个步骤
1.构造方法创建对象
*2.测量view的大小,onMeasure(int,int)
*3.确定view的位置,view自身有一定的建议权,决定权在父vew中,onlayout()
* 4.绘制view的内容,onDraw(canvas);
*
* */
/*
* 测量尺寸的回调方法
* */
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
/*设置当前view的大小
* */
setMeasuredDimension(backgroundBitmap.getWidth(),backgroundBitmap.getHeight());
}
/* 设置view的位置
*
* */
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
/*
* 绘制图片
* */
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/*绘制背景
*backgroundBitmap--要绘制的图片
* 左边界,
* 右边界
* 画笔
* */
canvas.drawBitmap(backgroundBitmap,0,0,paint);
//绘制按钮
canvas.drawBitmap(slideBtn,0,0,paint);
}
//手势
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()){
case MotionEvent.ACTION_DOWN://按下
break;
case MotionEvent.ACTION_MOVE://移动
break;
case MotionEvent.ACTION_UP://抬起
break;
default:break;
}
invalidate();//这句话是刷新,会调用onDraw() 方法
return true;
}
}
在xml中引用自定义的autodefineBtn:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<!--这里要使用自己定义的属性,就要配置这个命名可能概念,res后面的是包名-->
xmlns:lambo="http://schemas.android.com/apk/res/com.example.lambo.first"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
>
<!--这里的AutodefineButton是自定义的,要写全路径-->
<com.example.lambo.first.AutodefineButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<!--这是自定义的属性-->
lambo:test_msg="自定义的测试"
/>
</LinearLayout>
------------在res/values下创建atts.xml--声明给那个view添加自定义属性---------------
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--AutodefineButton是给哪一个view添加属性-->
<declare-styleable name="AutodefineButton">
<!--申明属性test_id,类型是integer-->
<attr name="test_id" format="integer"/>
<!--申明属性test_msg,类型是string-->
<attr name="test_msg" format="string"/>
<!--申明属性test_msg,类型是reference(引用类型)-->
<attr name="test_bitmap" format="reference"/>
</declare-styleable>
</resources>
最后
以上就是健壮方盒为你收集整理的android之自定义view、添加自定义属性的全部内容,希望文章能够帮你解决android之自定义view、添加自定义属性所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复