一、开发自定义View组件
View组件只是一个矩形的空白区域,并没有任何内容。对于Android应用的其他UI组件来说,它们都继承于View组件,然后在View组件提供的空白区域上绘制外观。当Android系统提供的UI组件不足以满足项目需要时,我们可以通过继承View来派生一个自定义组件。
举一个实例:实现一个跟随手指的小球。当用户通过手指在屏幕上拖动时,程序监听到这个手机动作,并把手指动作的位置传入自定义UI组件,并通知该组件重绘即可。开发步骤如下:
1.实现一个继承于View的子类
package com.example.mycustomview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * 项目名称/版本号:MyCustomView/v1.0 * 包 名:com.example.mycustomview * 类描述:绘制一个小球,并初始化其位置 * 创建人:jiangdongguo * 创建时间:2015-5-26 上午11:18:42 * 博客地址:http://blog.csdn.net/u012637501 */ public class DrawView extends View { public DrawView(Context context, AttributeSet attrs) { super(context, attrs); } private float currentX = 40; private float currentY = 50; /** * 定义并创建画笔 * */ Paint paint = new Paint(); protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setColor(Color.RED); //设置画笔的颜色 canvas.drawCircle(currentX, currentY, 30, paint);//指定位置绘制半径大小为15的圆 } /** * 为该组件的触屏事件重写事件处理方法 * */ public boolean onTouchEvent(MotionEvent event) { currentX = event.getX(); //获取当前触屏位置并修改currentX,currentY currentY = event.getY(); invalidate(); //通知当前组件重绘自己(即回调onDraw方法) return true; } }
2.在布局文件中添加自定义组件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 包名.类名 --> <com.example.mycustomview.DrawView android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
效果演示:
自定义UI组件常用重写方法总结:
>onFinishInflate():当应用从XML布局文件加载该组件并利用它来构建界面之后,该方法被回调;
>onMeasure(int,int):调用该方法来检测View组件及它所包含的所有子组件的大小;
>onLayout(boolean,int,int,int,int):当该组件需要分配其子组件的位置、大小时,回调该方法;
>onSizeChanged(int,int,int,int):当该组件的大小被改变时回调该方法;
>onDraw(Canvas):当该组件将要绘制它的内容时回调该方法进行绘制;
>onKeyDown(int,KeyEvent):当某个键被按下时触发该方法
>onKeyUp(int,KeyEvent):当松开某个键时触发该方法
>onTouchEvent(MotionEvent):当发生触屏事件时触发该方法
二、View类常用的XML属性
View类是所有可视化控件的基类,主要提供了控件绘制和事务处理的方法。创建用户界面所使用的控件都继承自View,如EditText、TextView、Button等。View及其子类的相关属性,既可以在布局XML文件中进行相关设置,也可以通过成员方法在Java代码中动态设置。
◇android:background:设置背景色/背景图片。可以通过以下两种方法设置背景为透明:”@android:color/transparent”和”@null”
◇android:layout_margin: 设置整个组件上下左右距离其他组件的边距,以像素为单位填充空白。
◇android:layout_marginLeft :设置整个组件左距离其他组件的边距,以像素为单位填充空白。
◇android:layout_marginRight :设置整个组件右距离其他组件的边距,以像素为单位填充空白。
◇android:layout_marginTopt :设置整个组件顶距离其他组件的边距,以像素为单位填充空白。
◇android:layout_marginBottom :设置整个组件底距离其他组件的边距,以像素为单位填充空白
◇android:clickable :是否响应点击事件。
◇android:contentDescription :设置View的备注说明,作为一种辅助功能提供,为一些没有文字描述的View提供说明,
◇ndroid:fadingEdge :设置拉滚动条时 ,边框渐变的放向。none(边框颜色不变),horizontal(水平方向颜色变淡),vertical(垂直方向颜色变淡)
◇android:fadingEdgeLength :设置边框渐变的长度
◇android:fitsSystemWindows:设置布局调整时是否考虑系统窗口(如状态栏)
◇android:isScrollContainer :设置当前View为滚动容器,ListView/ GridView/ ScrollView根本就不用设置这个属性,而EdidText设置android:scrollbars也能出滚动条。
◇android:keepScreenOn:View在可见的情况下是否保持唤醒状态
◇android:longClickable:设置是否响应长按事件.
◇android:padding 设置上下左右的边距,以像素为单位填充空白。
◇android:paddingBottom 设置底部的边距,以像素为单位填充空白。
◇android:paddingLeft 设置左边的边距,以像素为单位填充空白。
◇android:paddingRight 设置右边的边距,以像素为单位填充空白。.
◇android:paddingTop 设置上方的边距,以像素为单位填充空白。
◇android:scrollX 以像素为单位设置水平方向滚动的的偏移值,在GridView中可看的这个效果。
◇android:scrollY 以像素为单位设置垂直方向滚动的的偏移值
◇android:scrollbars 设置滚动条显示。none(隐藏),horizontal(水平),vertical(垂直)。
◇android:visibility 设置是否显示View。设置值:visible(默认值,显示),invisible(不显示,但是仍然占用空间),gone(不显示,不占用空间)
◇android:onClick 点击时从上下文中调用指定的方法。
◇android:drawableRight :在text的右边输出一个drawable,如图片
◇android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接
◇android:textScaleX :控制字与字之间的间距
◇android:textAlign :设置文字显示位置,EditText没有这个属性,但TextView有
◇android:autoText :如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。
◇android:editable :是否可编辑
◇android:textColorHint :设置提示信息文字的颜色,默认为灰色
◇android:textAppearance
textAppearanceButton、textAppearanceInverse、textAppearanceLarge、textAppearanceLargeInverse、textAppearanceMedium、textAppearanceMediumInverse、textAppearanceSmall、textAppearanceSmallInverse
设置文字外观。如“?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。
参考:http://blog.csdn.net/heng615975867/article/details/8910750