自定义控件
1. 什么是自定义控件?
1. 什么是自定义控件?
在Android系统中,用系统的自带控件重新组合或者自定义类继承View或者自定义类继承ViewGroup,实现特定的UI效果。
在Android中显示视图是View和ViewGroup两个控件,但是它们两个既有关联又有区别。ViewGroup是继承自View的,但是ViewGroup中的孩子又可以是View。我们的自定义控件继承自View和ViewGroup,所做的事情是有很大的区别的。
比如说,我们的控件继承自View,我们能做的是在里面绘制一些东西,不能操作多个孩子,因为View只能操作它自身的一些东西,但是ViewGroup内部可以有很多个孩子,比如说LinearLayout和RelativeLayout都是ViewGroup。
自定义控件有三种方式:
- 用系统控件进行组合
- 自定义一个类继承自
View- 自定义一个类继承自
ViewGroup
2. 为什么要学习自定义控件
- 系统的某一个控件,在不同的设备上,效果不一样。当我们想让这个控件在所有的设备显示都是一样的风格的时候,就需要自定义。
- 整个软件在不同设备风格统一,对所用控件都需要设置风格统一。
- 系统自带的控件,功能有限,增加功能;或者功能太多了,减掉功能。
- 把
ListView加上下拉刷新功能---功能增加 - 去掉
ViewPager的一些原有的事件---功能的减少
- 把
自定义控件原则:
- 如果系统控件能够满足需求,尽量采用系统控件去实现,自定义控件增加工作量或者会带来新
Bug。
3. 自定义控件的重要性
- 作为一个
Android程序员一定离不开自定义控件这样的需求- 工作是必须用到的
- 看懂别人的代码
- 面试的时候100%会问道
- 重点要了解几个方面
-
View和ViewGroup的区别 -
Android中事件的传递 -
View的原理
2.常用控件的回顾
1. 文本控件TextView和EditText
TextView控件继承自View类。TextView控件的功能是向用户显示文本内容,TextView不允许编辑。
EditText控件继承自TextView。TextView和EditText最大的不同是EditText是可以编辑的。
2. 图片控件ImageView
ImageView控件负责显示图片,其图片来源既可以是资源文件的id,也可以是Drawable对象或Bitmap对象,还可以是内容提供者(Content Provider)的Uri。
3. 按钮控件Button和ImageButton
Button控件继承自TextView类,Button的用法比较简单,主要是为Button设置一个点击事件监听器,并在编写按钮点击事件的处理代码。
ImageButton控件继承自ImageView。
ImageButton和Button的相同之处:都用于响应按钮的点击事件
不同之处:ImageButton只能显示图片;Button用于显示文字
4. 进度条ProgressBar
ProgressBar继承自View,用于显示正在运行的状态。有两种显示形式:一种是环形显示只用于显示状态,没有具体的进度。第二种是水平显示,可以显示具体的进度。
通过设置不同的style显示不同的样式:
style="?android:attr/processBarStyleLarge" // 环形
style="?android:attr/processBarStyleHorizontal" // 水平样式
5. 单选按钮RadioButton和复选按钮CheckBox
CheckBox和RadioButton都继承自CompoundButton,都只有选中和未选中两种状态,可以通过checked属性来设置。不同的是RadioButton是单选按钮,在一个RadioGroup中只能有一个RadioButton按钮处于选中状态;CheckBox则可以有很多个按钮被选中。
6.状态开关按钮ToggleButton
ToggleButton控件是继承自CompoundButton。ToggleButton的状态只能是选中和未选中,并且需要为不同的状态设置不同的显示文本。除了继承自父类的一些属性和方法之外,ToggleButton也有一些自己的属相。
7. 时钟控件AnalogClock和DigitalClock
AnalogClock继承自View,用于显示模拟时钟只显示时针和分针。
DigitalClock继承自TextView。用于显示数字时钟可精确到秒。时钟控件比较简单,只需要在布局文件中声明控件即可。
1. 优酷菜单
旋转动画
View动画
RotateAnimation rotateAnimation = new RotateAnimation(0,180,view.getWidth() / 2,view.getHeight());
rotateAnimation.setStartOffset(startOffset); // 延迟执行
rotateAnimation.setDuration(500);
rotateAnimation.setFillAfter(true);
view.startAnimation(rotateAnimation);
RotateAnimation rotateAnimation = new RotateAnimation(180,360,view.getWidth() / 2,view.getHeight());
rotateAnimation.setDuration(500);
rotateAnimation.setStartOffset(startOffset);
rotateAnimation.setFillAfter(true);
view.startAnimation(rotateAnimation);
属性动画
ObjectAnimator animator = ObjectAnimator.ofFloat(view,"rotation",0,180);
animator.setDuration(500);
animator.setStartDelay(startOffset);
animator.start();
// 设置旋转中心
view.setPivotX(view.getWidth() / 2);
view.setPivotY(view.getHeight());
ObjectAnimator animator = ObjectAnimator.ofFloat(view,"rotation",180,360);
animator.setDuration(500);
animator.setStartDelay(startOffset);
animator.start();
// 设置旋转中心
view.setPivotX(view.getWidth() / 2);
view.setPivotY(view.getHeight());
控件自身旋转的坐标,是以当前控件的左上方为原点坐标