Android自定义控件-继承已有控件

继承已有控件

在已有控件的基础上,继承组件,增加属性,来实现自己想要的效果。
步骤:

  • 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;//消费用户触摸事件,才可以收到其他事件
    }

源码下载地址:点击下载

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记住我的名字啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值