继承已有控件
在已有控件的基础上,继承组件,增加属性,来实现自己想要的效果。
步骤:
- 1.写个类继承已有控件
- 2.写布局,将包含包名的全路径写到xml中
- 3.界面中找到该控件, 设置初始信息
- 4.根据需求绘制界面内容
- 5.响应用户的触摸事件
效果图
原理解析
1.写个类继承已有控件
public class ExtendTextView extends TextView {
Paint paint1, paint2;
Canvas canvas;
private String controlText;
/**
* 用于代码创建控件
*
* @param context
*/
public ExtendTextView(Context context) {
super(context);
initView();
}
/**
* 用于xml使用,可以自定义属性
*
* @param context
* @param attrs
*/
public ExtendTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
/**
* 用于xml使用,可以自定义属性,如果制定了样式,走此构造函数
*
* @param context
* @param attrs
* @param defStyleAttr
*/
public ExtendTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ExtendTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initView();
}
private void initView() {
canvas = new Canvas();
paint1 = new Paint();
paint1.setColor(Color.BLUE);
paint1.setStyle(Paint.Style.FILL);
paint2 = new Paint();
paint2.setColor(Color.YELLOW);
paint2.setStyle(Paint.Style.FILL);
}
public void setControlText(String controlText) {
this.controlText = controlText;
setText(controlText);
}
}
2.写布局,将包含包名的全路径写到xml中
详细代码如下:
<com.houbingshuai.customcontrol.ExtendControl.ExtendTextView
android:id="@+id/tv_example"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="28sp"
android:textColor="@color/colorAccent"
android:layout_centerInParent="true" />
3.界面中找到该控件, 设置初始信息
public class ExtendControl extends Activity {
ExtendTextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.extend_control_main);
tv = (ExtendTextView) findViewById(R.id.tv_example);
tv.setControlText("1234567");
}
}
4.根据需求绘制界面内容
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint1);
canvas.drawRect(10, 10, getMeasuredWidth() - 10, getMeasuredHeight() - 10, paint2);
canvas.save();
super.onDraw(canvas);
canvas.restore();
// invalidate();
}
5.响应用户的触摸事件
5.1写一个触摸接口,代码如下
public interface onChangedTextListener {
void onChangedUpload(String s);
}
5.2写一个响应接口的方法
public void setChangedText(onChangedTextListener changedTextListener) {
this.changedTextListener = changedTextListener;
}
5.3代码中实现改接口回调
tv.setChangedText(new onChangedTextListener() {
@Override
public void onChangedUpload(String s) {
tv.setControlText(s);
}
});
5.4实现自定义点击方法(重写onTouchEvent方法)
//重新触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP: //当手抬起时响应事件
if (changedTextListener != null) {
changedTextListener.onChangedUpload("7654321");
}
break;
}
invalidate();//重新绘制界面
return true;//消费用户触摸事件,才可以收到其他事件
}