1. 自定义控件---优酷菜单

自定义控件

1. 什么是自定义控件?

1. 什么是自定义控件?

Android系统中,用系统的自带控件重新组合或者自定义类继承View或者自定义类继承ViewGroup,实现特定的UI效果。

Android中显示视图是ViewViewGroup两个控件,但是它们两个既有关联又有区别。ViewGroup是继承自View的,但是ViewGroup中的孩子又可以是View。我们的自定义控件继承自ViewViewGroup,所做的事情是有很大的区别的。

比如说,我们的控件继承自View,我们能做的是在里面绘制一些东西,不能操作多个孩子,因为View只能操作它自身的一些东西,但是ViewGroup内部可以有很多个孩子,比如说LinearLayoutRelativeLayout都是ViewGroup

自定义控件有三种方式:

  • 用系统控件进行组合
  • 自定义一个类继承自View
  • 自定义一个类继承自ViewGroup
2. 为什么要学习自定义控件
  • 系统的某一个控件,在不同的设备上,效果不一样。当我们想让这个控件在所有的设备显示都是一样的风格的时候,就需要自定义。
  • 整个软件在不同设备风格统一,对所用控件都需要设置风格统一。
  • 系统自带的控件,功能有限,增加功能;或者功能太多了,减掉功能。
    • ListView加上下拉刷新功能---功能增加
    • 去掉ViewPager的一些原有的事件---功能的减少

自定义控件原则:

  • 如果系统控件能够满足需求,尽量采用系统控件去实现,自定义控件增加工作量或者会带来新Bug
3. 自定义控件的重要性
  1. 作为一个Android程序员一定离不开自定义控件这样的需求
    • 工作是必须用到的
    • 看懂别人的代码
  2. 面试的时候100%会问道
    • 重点要了解几个方面
    • ViewViewGroup的区别
    • Android中事件的传递
    • View的原理

2.常用控件的回顾

1. 文本控件TextViewEditText

TextView控件继承自View类。TextView控件的功能是向用户显示文本内容,TextView不允许编辑。
EditText控件继承自TextViewTextViewEditText最大的不同是EditText是可以编辑的。

2. 图片控件ImageView

ImageView控件负责显示图片,其图片来源既可以是资源文件的id,也可以是Drawable对象或Bitmap对象,还可以是内容提供者(Content Provider)Uri

3. 按钮控件ButtonImageButton

Button控件继承自TextView类,Button的用法比较简单,主要是为Button设置一个点击事件监听器,并在编写按钮点击事件的处理代码。

ImageButton控件继承自ImageView
ImageButtonButton的相同之处:都用于响应按钮的点击事件
不同之处:ImageButton只能显示图片;Button用于显示文字

4. 进度条ProgressBar

ProgressBar继承自View,用于显示正在运行的状态。有两种显示形式:一种是环形显示只用于显示状态,没有具体的进度。第二种是水平显示,可以显示具体的进度。
通过设置不同的style显示不同的样式:

style="?android:attr/processBarStyleLarge" // 环形
style="?android:attr/processBarStyleHorizontal" // 水平样式
5. 单选按钮RadioButton和复选按钮CheckBox

CheckBoxRadioButton都继承自CompoundButton,都只有选中和未选中两种状态,可以通过checked属性来设置。不同的是RadioButton是单选按钮,在一个RadioGroup中只能有一个RadioButton按钮处于选中状态;CheckBox则可以有很多个按钮被选中。

6.状态开关按钮ToggleButton

ToggleButton控件是继承自CompoundButtonToggleButton的状态只能是选中和未选中,并且需要为不同的状态设置不同的显示文本。除了继承自父类的一些属性和方法之外,ToggleButton也有一些自己的属相。

7. 时钟控件AnalogClockDigitalClock

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());

控件自身旋转的坐标,是以当前控件的左上方为原点坐标

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容