自定义View

来源:互联网 发布:游戏中用得最多的算法 编辑:程序博客网 时间:2024/06/08 02:15

Android中内置的UI控件和布局无法满足需求的时候,就需要进行自定义。

自定义View有三种方式:

1.继承已有的控件来实现自定义控件。

2.继承ViewGroup,把多个控件组合成一个自定义控件(组合控件)。

3.通过View类来完全自定义控件(当1.2均不满足时再考虑完全自定义控件)。


注意:

自定义空间的类构造方法,如果需要在Layout中使用,则控件必须包含两个或三个参数的构造方法。

还有,layout文件中的控件名称必须是自定义控件类包的完全限定名!


看一下几个Demo:

1.自定义EditText,在EditText前端显示提示的文字“Name”:

public class MyEditTextOne extends EditText {
    //画笔    private Paint paint;    public MyEditTextOne(Context context) {        super(context);        initPaint();    }    public MyEditTextOne(Context context, AttributeSet attrs) {        super(context, attrs);        initPaint();    }    private void initPaint(){
//创建画笔        paint = new Paint();
//设定画笔的颜色        paint.setColor(Color.RED);
//设定文字的大小        paint.setTextSize(30);
//抗齿        paint.setAntiAlias(true);    }    @Override    protected void onDraw(Canvas canvas) {
//保持原有的绘制逻辑        super.onDraw(canvas);
//绘制自己特定的逻辑        canvas.drawText("Name :",30,getHeight()/2,paint);    }}
布局代码:
<com.shen.mycustomview.MyEditTextOne    android:paddingLeft="35dp"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:hint="请输入姓名"    android:id="@+id/etOne"/>
2.自定义EditText,默认情况下在EditText右边显示如下;
当文本发生改变时切换成如下图片,当点击其他图片时删除EditText中输入的内容
代码实现:
public class MyEditTextTwo extends EditText {
    //默认图片    private Drawable normalDrawable;
    //清除图片    private Drawable clearDrawable;    public MyEditTextTwo(Context context) {        super(context);        initPaint();    }    public MyEditTextTwo(Context context, AttributeSet attrs) {        super(context, attrs);        initPaint();    }
    //初始化方法    private void initPaint(){
//得到图片        normalDrawable = getResources().getDrawable(R.mipmap.btn_title_back_default_theme_1,null);        clearDrawable = getResources().getDrawable(R.mipmap.btn_title_back_default_theme_2,null);
//把默认图片添加到EditText控件的右边        setCompoundDrawablesWithIntrinsicBounds(null,null,normalDrawable,null);
//监听文本变化事件
        addTextChangedListener(new TextWatcher() {            @Override            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {            }            @Override            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    //文本发生变化时变为清除图标                    setCompoundDrawablesWithIntrinsicBounds(null,null,clearDrawable,null);            }            @Override            public void afterTextChanged(Editable editable) {            }        });    }
    //监听触控事件
    @Override    public boolean onTouchEvent(MotionEvent event) {
//判断是否触控结束以及清除图标是否还存在        if(event.getAction() == MotionEvent.ACTION_UP&&clearDrawable!= null){
   //获得用户触摸的X与Y坐标点            int touchX = (int) event.getX();            int touchY = (int) event.getY();
//判断触摸点是否在清除图标的范围之内            if((touchX>=(getWidth()-getTotalPaddingRight()))&&(touchX<=(getWidth()-getPaddingRight()))&&(touchY>=0)&&(touchY<=(getHeight()))){
//是的话就清空文本                 setText("");
//同时将图标恢复为默认图标                setCompoundDrawablesWithIntrinsicBounds(null,null,normalDrawable,null);            }        }        return super.onTouchEvent(event);    }}
布局代码:
<com.shen.mycustomview.MyEditTextTwo    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:id="@+id/etTwo"/>

3.组合控件。
______________  X
将几个控件组合在一起,点击X图片清空EditText中的文本:
代码实现:
public class MyEdiTextImageView extends LinearLayout {    private Paint paint;
   //声明组合的原生控件    private EditText editText;    private ImageView ivPic;    public MyEdiTextImageView(Context context) {        super(context);    }    public MyEdiTextImageView(Context context, AttributeSet attrs) {        super(context, attrs);
//创建控件        editText = new EditText(context);
//设置创建的EditText的属性        editText.setLayoutParams(new ViewGroup.LayoutParams(300,ViewGroup.LayoutParams.WRAP_CONTENT));        ivPic =  new ImageView(context);        ivPic.setImageResource(R.mipmap.btn_title_back_default_theme_2);
//添加View        addView(editText);        addView(ivPic);
//给图片添加点击监听        ivPic.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View view) {
//点击图片清空EditText文本                editText.setText("");            }        });    }}

布局代码:
<com.shen.mycustomview.MyEdiTextImageView    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:id="@+id/etGroupView"/>

4.完全自定义View,如画圆:
public class MyView extends View {    private Paint paint;    public MyView(Context context) {        super(context);        initPaint();    }    public MyView(Context context, AttributeSet attrs) {        super(context, attrs);        initPaint();    }    private void initPaint(){        paint = new Paint();        paint.setAntiAlias(true);        paint.setColor(Color.RED);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        setMeasuredDimension(600,300);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.drawCircle(150,150,50,paint);    }}
布局代码:
<com.shen.mycustomview.MyView    android:layout_width="match_parent"    android:layout_height="wrap_content"/>


OK,以上就是我所了解到的自定义View的内容~希望大家一起交流一起进步


0 0
原创粉丝点击