周总结只作为自己学习复习之用
Android自定义控件
1.视图动画
drawable图片在xml中因为布局控件先后顺序不同可造成覆盖,引起点击事件问题
set选择器,enable选中,check多选,selected用于button
View只get到外层自己
ViewGroup可get到孩子
视图动画不改变原位置,属性动画改变位置
2、自定义控件时可用hideview和showview单独进行控件的显示隐藏(案例看尚硅谷的优酷菜单点击事件)
3.ViewPager 广告条效果
ViewPager大图,底部文字布局
ViewPager对应的PageAdapter
小圆点需要对ViewPager变化进行监听
小圆点有两种做法,shape和图片,显示选择用enable
小圆点用LayoutPrams添加布局宽高(案例参考尚硅谷的ViewPager广告条效果)
ViewPager的图片添加用ImageView.addView()
for(int i;imageviews.length;i++){
ImageView.addView(imageviews[i]) ;
}
4.PagerAdapter
有position的时候需要对int类型取模,position%imageviews.size()
第一次往左滑滑不动的问题,是因为默认从0开始,所以设置时viewpager.setCurrentItem(中间位置)
中间位置可用Integer.MaxVALUE/2,但要保证是imageviews的整数倍,所以最终方法为
viewpager.setCurrentItem(Integer.MaxVALUE/2-Integer.MaxVALUE/2%imageviews.size())
注:Integer.MaxVALUE的值是20亿多
5.handler
用来自动滑动广告条幻灯片
但按住广告条还会动,需要用TouchListener控制
handler.removeCallbackAndMessages(null)将队列中消息全部移除
6.Touch触发事件
解决滑动冲突,手滑动火按下时停止滑动
up事件丢失时会出发Action-cancel取消
当按下滑动之后松开就会引起up事件丢失,这种情况可以用ViewPager监听中的onPageScrollStateChanged来解决拖拽问题
设置tag imageView.setTag(position)来确定点击位置
在onclick时,要对position取模,否则会造成数组越界
int position = (int)View.getTag()%imageviews.size()
触摸事件和点击事件同时存在会有冲突
7,popwindow
不要忘记设置焦点 setFocusable(true) 否则不能点击
写完布局看不到时可以刷新布局,也可以更改AppTheme
8.自定义控件思维导图
(1).自定义控件概念 情况
(2).用系统控件重新组合,案例 优酷菜单、广告条、欢迎页、下拉框
(3)自定义类继承View 案例 自定义开关、自定义属性、水波纹、 联系人快速索引
9.adapter.notifyDataSetChanged()先执行getCount()后执行getView()
结束后popwindow要dissmiss释放资源
代码中设置数值宽高时是px需要用dp转换工具
10.自定义类继承View
a.构造方法实例化
b。测量messure(int,int)——onMessure()
c。如果当前View是ViewGroup,还有义务测量孩子
d。孩子有建议权。
e。指定位置layout()——onLayout()指定控件的位置,一般View不用写这个方法,ViewGroup的时候才需要,因为View中会设置为Final,子类不能修改
f。绘制视图 draw()——onDraw(canvas)根据上面两个方法的参数进行绘制
一个视图从创建到现实过程的主要方法
View中的onDraw()是空方法,ViewGroup不用实现它
11.onTouch触摸事件
onTouch触摸事件必须先调用父类super.onTouchEvent(event)方法
否则无法回传触摸点击
(1)用setMeassureDimens()保存视图测量结果,视图大小将在这里最终确定
(2)内部设置点击事件和外部是一样的
(3)invalidate()方法会导致onDraw执行,强制进行刷新
(4)触摸事件,last原始值用来判断是否滑动
getX()取相对于控件原点
getRawX()取相对于屏幕原点
a.记录按下坐标 lastX= getX if(Math.abs(endX-lastX))就是滑动的距离
b.计算结束值
c.计算偏移量 float distanceX = endX- lastX
slideLeft+=distanceX
d.屏蔽非法值 if(slideLeft<0) slideLeft= 0; else slideLeft>slideMax slideLeft = slideMax
e.刷新 invalidate()
f. 数据还原 startX= event.getX()
(5)要么点击事件生效,要么触摸滑动事件生效,用boolean isEnableclick来判断
12. 自定义属性
format 常用类型
reference 引用
color 颜色
boolean
dimension 尺寸值
float
integer
String
enum
JNI用C语言操作了Java时用反射
自定义类通过布局的全类名去反射找到类的属性,被封装到自定义类的Attribute中
13.获取属性的三种方式
a.用命名空间获取(自己定义的命名空间)
b。遍历属性集合(getAttributeCount)
c。使用系统工具,获取属性(这种最常用,TypeArray)