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的内容~希望大家一起交流一起进步