android学习---自定义View

通过这篇博客,来对上次培训课进行知识点梳理和回顾

自定义View的定义  : 通过直接继承View或者重写View子类实现逻辑的View

如何使用自定义View

自绘控件:直接继承View类的方式

自绘控件的步骤:1.继承View  

                             2.实现Listener接口(不是必须的)

                             3.重写构造方法(两个参数)                      

public class CountNumView extends View {
      public CountNumView(Context context, AttributeSet attrs) {
          super(context, attrs);
    }           

                                        
                                4.重写onDraw方法 

                                5.Paint画笔                              

Paint常用方法解释Paint常用方法解释
setAntiAlias()设置画笔的锯齿效果setStyle()设置画笔的风格(空心或实心)
setColor() 设置画笔的颜色 setStrokeWidth()设置空心边框的宽度
setARGB()设置画笔的A、R、G、B值  getColor()获取画笔的颜色
setAlpha()设置画笔的Alpha值(透明度)  setTextSize()设置字体的尺寸

                                6.Canvas绘制                           

Canvas的常用方法解释Canvas的常用方法解释
drawLine()绘制直线   drawRect() 绘制矩形
drawCircle()绘制圆形drawText()绘制字符
drawBitmap() 绘制图形  

                                                     
                                7.invalidate方法刷新 (  1.主要作用是请求View树进行重绘; 2.调用invalidate方法后,将会再次                                 执行onDraw方法)  
                                                               

                                8.在布局文件中引用(包名.类名)

<com.view.CountNumView  包名.类名
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         />

      
重写控件:间接继承View子类的方式
     步骤:1.继承系统提供的View
                2.重写对应的构造方法(两个参数)
                3.实现逻辑并定义事件监听
                4.在布局文件中引用     

   重写ListView实现下拉刷新

       步骤:1.在layout下编写下拉刷新头部布局             

<TextView 
     android:layout_width="match_parent"
     android:layout_height="60dp"
     android:text="正在刷新"
    android:gravity="center"
     />          

                  2.新建类继承ListView   

                  3.实现构造方法  

                  4.将头部布局通过addHeaderView添加到ListView头部  

                  5.将头部布局的Padding值设为负数,隐藏头部  

                  6.重写onTouchEvent事件    

                  7.在MotionEventACTION_MOVE中判断是否下拉  

                  8.不断修改头部布局Padding为正数,显示到屏幕上      

public class RefreshListView extends ListView {
	private int headerViewHeight;
	private int downY;
	private int moveY;
	private View v;

	public RefreshListView(Context context, AttributeSet attrs) {
		super(context, attrs);

		v = inflate(context, R.layout.listview_header, null);

		v.measure(0, 0);
		// 获取顶部视图的高度
		headerViewHeight = v.getMeasuredHeight();

		v.setPadding(0, -headerViewHeight, 0, 0);

		// 添加顶部视图
		addHeaderView(v);
	}

	@Override
	public boolean onTouchEvent(MotionEvent ev) {

		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			// 获取手指按下时Y轴坐标
			downY = (int) ev.getY();
			break;
		case MotionEvent.ACTION_MOVE:
			// 手指在屏幕上移动的距离
			moveY = (int) ((ev.getY() - downY) * 0.3);
			// 动态设置padding
			v.setPadding(0, moveY - headerViewHeight, 0, 0);
			v.invalidate();
			invalidate();
			break;
		case MotionEvent.ACTION_UP:
			// 手指抬起时重新隐藏HeaderView
			v.setPadding(0, -headerViewHeight, 0, 0);
			break;

		default:
			break;
		}
		return super.onTouchEvent(ev);
	}

}

 然后再在布局文件中运用包名和类名引用

                       

         

组合控件:间接继承View子类,将需要用到的原生控件组合到一起

    组合控件的使用,通过代码来回忆

     1.先定义你要把它当做组合控件的布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

     <TextView
         android:id="@+id/textviewspicejiage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="¥41.90"
        android:textColor="#bb5555"
        android:textSize="20sp" />

    <Button
        android:id="@+id/button_spiceitemgoumai"
        android:layout_width="80dp"
        android:layout_height="30dp"
        android:layout_marginLeft="80dp"
        android:background="@drawable/rgister_btn_bk"
        android:text="购买"
        android:textColor="#ffffff" />

</LinearLayout>

     2.然后再建一个Java文件,构造布局选择器

public class FoodListviewzuhe  extends LinearLayout{

	public FoodListviewzuhe(Context context, AttributeSet attrs) {
		super(context, attrs);
		LayoutInflater inflate = LayoutInflater.from(context);
		View view=inflate.inflate(R.layout.fooditemzuhe, null);
		this.addView(view);
	}

}      


  3.然后在布局文件中引用

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.view.FoodListviewzuhe
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </com.view.FoodListviewzuhe>

</LinearLayout>


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值