11月19至11月24Android学习周总结

周总结只作为自己学习复习之用

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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值