day53_自定义控件第01天
01_View和ViewGroup的介绍
-
原生控件
-
自定义控件
-
组合控件
-
自己绘制控件(绘制 + 行为)
-
View和ViewGroup
关系:View和ViewGroup
-
继承关系
-
组合关系
-
作用
View的直系分支:绘制图形
ViewGroup:管理控件(也可以绘制)
属性中以layout开始的都是对父容器的要求
02_广告_布局的实现
-
功能分析:
-
滑动时圆点的切换
-
滑动时切换图片
-
滑动文本的切换
-
无限滑动
ViewPager:support.v4包中的控件
轮播图的布局:
RelativeLayout
ImageViewView
LinearLayout
TextView
LinearLayout
View
03_源码关联
-
移除依赖 --》 Build Path --》libraries --》移除 Android Dependency
-
选中libs下的jar--》build Path
-
关联源码:attach source(Viewpager) --》SDK下的extras--》Android --》 support
-
右键项目 --> android tools --> fix project properties
04_广告_ViewPager的Adapter
// 页面的数量
@Override
publicint getCount() {
// 标记方法,用来判断缓存标记
@Override
publicboolean isViewFromObject(View arg0, Object arg1) {
// view :显示的View
// object:标记
// 判断有没有缓存
// 初始化item
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 用来添加要显示的View的
// 记录缓存标记 -- return 标记(标记可以自己指定)
@Override
publicvoid destroyItem(ViewGroup container, int position, Object object) {
// 销毁移除的item
// object标记
05_ViewPager_加载的流程
06_广告_数据的加载
// 设置适配器 --- 自己实现adapter ---》集合list< 数据 >依赖于数据
public int getCount() {
if (mListDatas != null) {
returnmListDatas.size();
}
return 0;
}
public Object instantiateItem {
ImageView iv = mListDatas.get(position);
// 用来添加要显示的View的
mPager.addView(iv);
}
移除
ImageView iv = mListDatas.get(position);
mPager.removeView(iv);
07_ViewPager回调方法的介绍
参数:
向谁里添加view就要new出他标准的params
VIewPager的事件监听:
mPager.setOnPageChangeListener(this);
// 回调方法,当viewpager的某个页面选中时的回调
@Override
publicvoid onPageSelected(int position) {
// 回调方法,当ViewPager滚动时回调
@Override
publicvoid onPageScrolled(
// position :当前选中的位置
// positionOffset:滑动的百分比
// positionOffsetPixles:滑动的像素
08_广告_文本和点的选中处理
09_广告_无限滑动的实现
viewpager缓存:最多三个
设置页面缓存的数量(左右两侧):
public void setOffscreenPageLimit(int limit) {
通过limit设置
无限滑动:
设置页面的数量为无限
每个牵扯到position的方法都需要取模
10_优酷_布局的实现
View的形状:方形
控件的拆分:
布局的层次:
使用相对布局
后布局的在最外面一层
-
最大
-
中间
-
最小
11_优酷_home按钮点击的逻辑
功能分析
-
内侧的home按钮的点击
通过两个boolean 类型的变量记录两个菜单的状态,每次状态改变时同时改变这两个变量
设置home 按钮的点击事件:三种状态
-
二级和三级都显示——全部隐藏
-
二级显示,三级不显示——全部隐藏
-
二级和三级都隐藏——显示二级
12_优酷_显示隐藏动画的实现
给组件设置一个旋转动画
/**
* 隐藏菜单
* @param container
*/
private void hideLevel(RelativeLayout container,long startOffset){
RotateAnimation animation = new RotateAnimation(0,-180,
RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimation.RELATIVE_TO_SELF,1f);
animation.setDuration(600);
animation.setFillAfter(true); // 保持播放完的状态
animation.setStartOffset(startOffset);// 设置动画延时执行
container.startAnimation(animation);
}
通过设置animation.setStartOffset(startOffset);,使两个菜单播放的先后不同
13_优酷_二级菜单按钮的实现
添加监听事件
14_优酷_动画播放的Bug解决
有动画在执行的时候不要触发点击事件
在两个播放动画的按钮监听事件上面,执行动画前面做一个判断
在动画上添加一个监听事件
animation.setAnimationListener(new AnimationListener(){
@Override
publicvoid onAnimationStart(Animation animation) {
// 动画开始播放的回调方法
mAnimationCount++; // 当前有几个动画在播放
@Override
publicvoid onAnimationEnd(Animation animation) {
// 动画结束播放的回调方法
mAnimationCount--;
}
})
15_优酷_硬件菜单按钮的实现
接收硬件的点击事件
@Override
publicboolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
// 点击的是menu按钮
Log.d(TAG, "点击了硬件的menu");
clickHardwareMenu();
// 消费menu点击事件
returntrue;
}
returnsuper.onKeyUp(keyCode, event);
}
处理硬件的点击事件,
-
三个都不可见
-
三个都可见
-
三不可见,一二可见
-
二三不可见,一可见
privatevoid clickHardwareMenu() {
// 如果三个菜单都可见,隐藏三个菜单
if (isLevel1Display && isLevel2Display && isLevel3Display) {
hideLevel(mRlLevel3, 0);
hideLevel(mRlLevel2, 100);
hideLevel(mRlLevel1, 200);
// 改变状态
isLevel1Display = false;
isLevel2Display = false;
isLevel3Display = false;
return;
}
16_属性动画的简单介绍
动画操作:
-
ViewAnimation:补间动画
旋转,位移,缩放,透明度,set
-
原理
通过父容器来绘制自己动画时的样子
实际控件本身并没有移动
-
-
property Animation:属性动画(补间动画可以做到的,都可以做到,做不到的他也可以做到)
-
原理 (Android 3.0之后的)
改变自身的属性来显示动画的
调用自身的可以设置属性的方法来改变属性
-
类:
ObjectAnimator
ofFloat,ofInt,ofObject
-
Drawable Animation:帧动画
17_优酷_菜单View的封装
解决点击菜单BUG
int count = container.getChildCount();
for (int i = 0; i < count; i++) {
container.getChildAt(i).setEnabled(false);
}
封装:
Activity和View都有OnkeyUp()方法
View.inflate()
// 将Xml和class绑定,this表示这个view填充整个布局
View.inflate(context, R.layout.youku_view, this);
// 将所有的点击事件传递给这个view
setFocusableInTouchMode(true);
主Activity:设置布局文件即可
在主Activity中向view类中的控件设置监听事件
DemoActivity.java
YoukuView.java
18_下拉_布局的实现
shape:圆角矩形
corners:半径
stroke:边框
padding:边框距离
19_下拉_弹出层的添加
20_下拉_adapter的新建
将textview替换成listview
21_下拉_功能的实现
功能:
-
添加数据到listview
-
设置点击删除事件:移除数据即可,然后更新UI
-
设置点击item添加数据到输入框:隐藏组件方法:dismiss
22_下拉_封装
将数据和view分开,即Activity和view分开
DemoActivity.java(数据)
classMyAdapterextends BaseAdapter {
class ViewHolder {
设置点击事件,通过方法调用view设置view里面的点击事件(不能直接设置)
@Override
publicvoid onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// 设置输入框内容
String data = mDatas.get(position);
mSpinnerView.setText(data);
mSpinnerView.setSelection(data.length());
// 隐藏popu
mSpinnerView.dismiss();
}
SpinnerView.java
设置view