自定义View(一)

来源:互联网 发布:程序员笔记本电脑 编辑:程序博客网 时间:2024/05/12 10:31

初体验与介绍:

自定义View分三种:

第一种就是继承一个控件,然后在它的基础上继续自定义:

比如TextView,我要加一个特性,在字体上加一个框:(参考Android群英传第三章)

public class XyTextView extends AppCompatTextView {    private Paint mPaint;    public XyTextView(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);        //初始化画笔,并设置抗锯齿属性        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        //设置画笔颜色        mPaint.setColor(Color.BLUE);        //设置画笔风格,画边框线不填充        mPaint.setStyle(Paint.Style.STROKE);        //设置画笔画边框线的宽度,单位:px        mPaint.setStrokeWidth(2F);    }    @Override    protected void onDraw(Canvas canvas) {        //绘制内容之前、        //画个矩形        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);        //画完保存        canvas.save();        //绘制内容        super.onDraw(canvas);    }}




第二种是扩展,就是讲几个控件组合起来成一个常用的新控件:

public class XyLogin extends LinearLayout implements View.OnClickListener {    private EditText account;    private EditText password;    private Button loginBtn;    private OnLoginClick loginClick;    public void setLoginClick(OnLoginClick loginClick) {        this.loginClick = loginClick;    }    /**     * 按钮回调     */    public interface OnLoginClick {        void click(View v);    }    public XyLogin(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);        //加载布局        LayoutInflater.from(context).inflate(R.layout.view_login, this, true);    }    /**     * 解析布局后执行     */    @Override    protected void onFinishInflate() {        super.onFinishInflate();        account = findViewById(R.id.account);        password = findViewById(R.id.password);        loginBtn = findViewById(R.id.loginBtn);        loginBtn.setOnClickListener(this);    }    @Override    public void onClick(View v) {        loginClick.click(loginBtn);    }    /**     * 设置账号密码文字的设置和获取     */    public void setAccount(String accountStr) {        account.setText(accountStr);    }    public String getAccount() {        return account.getText().toString();    }    public void setPassword(String passwordStr) {        password.setText(passwordStr);    }    public String getPassword() {        return password.getText().toString();    }    }



这样组装一个登陆控件(这是最简单的属性设置,想精美一点的可以自己去设置)

但是这种一般很少用,跟鸡肋差不多,只能作为一个知识点来了解。


第三种是最牛逼的,也是大部分人可望不可即的,真正的自定义View,继承View,自己去绘制 。

来个最简单的圆先看看:

public class XyCircle extends View {    private Paint mPaint;    public XyCircle(Context context) {        this(context, null);    }    public XyCircle(Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public XyCircle(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mPaint.setStyle(Paint.Style.FILL);        mPaint.setColor(Color.RED);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.drawCircle(100, 100, 100, mPaint);    }}




目前就这三种,或者我孤陋寡闻还存在别的。
android的进阶,这个自定义是绕不过去的,所以干脆别绕,也别想着一直在github上拿,总有砸到脚的时候