自定义初学2——扩展View

简介: 倘若我们需要的功能找不到对应的系统控件了,这时我们就只能自己绘制了。首先定义一个继承View的基类,然后重写View类的一个或多个方法。

倘若我们需要的功能找不到对应的系统控件了,这时我们就只能自己绘制了。首先定义一个继承View的基类,然后重写View类的一个或多个方法。

通常可以被重写的方法有这些:

onFinishInflate(): 这是一个回调方法,当应用从XML布局文件中加载组件时,该方法将被调用。

onMeasure(int,int): 该方法用来检测View组件及他所包含的所有子组件的大小。

onLayout(boolean, int, int, int, int): 当该组件分配其子组件的位置、大小时,就会被调用。

onSizeChanged(int, int, int, int): 当该组件的大小被改变时回调该方法。

onDraw(android.graphics.Canvas): 当该组件将要绘制他的内容时回调该方法。

onKeyDown(int, android.view.KeyEvent): 当某个键被按下时触发该方法。

onKeyUp(int, android.view.KeyEvent):  当某个键被松开时触发该方法。

onTrackballEvent(android.view.MotionEvent): 当发生轨迹球事件时触发该方法。

onTouchEvent(android.view.MotionEvent): 当发生触摸屏事件时触发该方法。

onFocusChanged(boolean, int, android.graphics.Rect): 当该组件得到、失去焦点时触发该方法。

onWindowFocusChanged(boolean): 当包含该组件的窗口得到、失去焦点时触发该方法。

onAttachedToWindow(): 当把该组件放入某个窗口时触发该方法。

onDetachedFromWindow():当把该组件从某个窗口分离时触发该方法。

onWindowVisibilityChanged(int): 当包含该组件的窗口的可见性发生改变时触发该方法。


当然我们并不需要重写所有的方法,而是根据功能需求写相关的方法就可以了。


下面是一个重写了onDraw方法的view,我们做一个能跟随手指移动的小球,上代码

CustomView.java


public class CustomView extends View {

 public float currentX ;

 public float currentY ;

 // 画笔

 Paint mPaint;

 public CustomView(Context context) {

  super(context);

  

 }

 public CustomView(Context context, AttributeSet attrs) {

  super(context, attrs);

   initPaint();

 }


 private void initPaint(){

  //画笔初始化

  mPaint=new Paint();

//设置抗锯齿

  mPaint.setAntiAlias(true);

  // 设置画笔的颜色

  mPaint.setColor(Color.RED);

 

 }

 @Override

 public void onDraw(Canvas canvas) {

  super.onDraw(canvas);

 

 

  // 绘制一个小圆(作为小球)

  canvas.drawCircle(currentX, currentY, 15, mPaint);

 }

 @Override

 public boolean onTouchEvent(MotionEvent event) {

  // 当前组件的currentX、currentY两个属性

  this.currentX = event.getX();

  this.currentY = event.getY();

  // 通知该组件重绘

  this.invalidate();

  // 返回true表明处理方法已经处理该事件

  return true;

 }

}


然后直接在要用的布局文件中加载就行了,这里就不说了

源代码


参考:


相关文章
构建一个可复用的自定义BaseAdapter
本节给大家带来的是构建一个可复用的自定义BaseAdapter,我们每每涉及到ListView GridView等其他的Adapter控件,都需要自己另外写一个BaseAdapter类,这样显得非常麻烦, 又比如,我们想在一个界面显示两个ListView的话,我们也是需要些两个BaseAdapter。
81 0
|
Android开发
android 通用是框架,对导航栏和fragment的封装
android 通用是框架,对导航栏和fragment的封装
android 通用是框架,对导航栏和fragment的封装
|
Java Android开发
【Android 组件化】路由组件 ( 注解处理器参数选项设置 )
【Android 组件化】路由组件 ( 注解处理器参数选项设置 )
171 0
【Android 组件化】路由组件 ( 注解处理器参数选项设置 )
|
Java Android开发
【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )(一)
【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )(一)
185 0
【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )(一)
|
Android开发
【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )(二)
【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )(二)
161 0
【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )
【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )
508 0
【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )
|
Windows
UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项
原文 UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项 在 Windows 10 的前几个版本中将页面内容扩展到标题栏上还算简单,主要是没什么坑。直到一些新控件的引入和一些外观设计趋势变化之后,扩展标题栏开始出现一些坑了。
1240 0