Android 自定义实现轮播图效果

2017-11-02 10.46.27.gif

本次使用ViewGroup实现自定义轮播效果,Demo地址戳这里👇

ViewGroup

  • 我们知道ViewGroup就是View的容器类,我们经常用的LinearLayout,RelativeLayout等都是ViewGroup的子类,因为ViewGroup有很多子View,所以它的整个绘制过程相对于View会复杂一点,但是还是三个步骤measure,layout,draw,我们一次说明。

  • ViewGroup相当于一个放置View的容器,并且我们在写布局xml的时候,会告诉容器(凡是以layout为开头的属性,都是为用于告诉容器的),我们的宽度(layout_width)、高度(layout_height)、对齐方式(layout_gravity)等;当然还有margin等;于是乎,ViewGroup的职能为:给childView计算出建议的宽和高和测量模式 ;决定childView的位置;为什么只是建议的宽和高,而不是直接确定呢,别忘了childView宽和高可以设置为wrap_content,这样只有childView才能计算出自己的宽和高。

  • Measure
    - Measure过程还是测量ViewGroup的大小,如果layout_widht和layout_height是match_parent或具体的xxxdp,就很简单了,直接调用setMeasuredDimension()方法,设置ViewGroup的宽高即可,如果是wrap_content,就比较麻烦了,我们需要遍历所有的子View,然后对每个子View进行测量,然后根据子View的排列规则,计算出最终ViewGroup的大小。

Measure
  • Layout
    • layout过程其实就是对子View的位置进行排列,onLayout方法给我一个机会,来按照我们想要的规则自定义子View排列。
    • 其中view.layout(left,top,right,bottom)方法可以对子View的位置进行设置。
Layout
  • Draw
    • ViewGroup在draw阶段,其实就是按照子类的排列顺序,调用子类的onDraw方法,因为我们只是View的容器, 本身一般不需要draw额外的修饰,所以往往在onDraw方法里面,只需要调用ViewGroup的onDraw默认实现方法即可。
    • LayoutParams
      ViewGroup还有一个很重要的知识LayoutParams,LayoutParams存储了子View在加入ViewGroup中时的一些参数信息,在继承ViewGroup类时,一般也需要新建一个新的LayoutParams类,就像SDK中我们熟悉的LinearLayout.LayoutParams,RelativeLayout.LayoutParams类等一样,那么可以这样做,在你定义的ViewGroup子类中,新建一个LayoutParams类继承与ViewGroup.LayoutParams。
    • 不需要重写,使用ViewGroup默认实现即可。

View中还有三个比较重要的方法

  • requestLayout
    View重新调用一次layout过程。
  • invalidate
    View重新调用一次draw过程
  • forceLayout
    标识View在下一次重绘,需要重新调用layout过程。

ViewGroup中 onInterceptTouchEvent(MotionEvent ev)方法是为了拦截事件的。

  • 因为事件默认会往下传递,如果发现该事件我应该捕获那就让它返回true。然后就会交给onTouchEvent处理。返回false则交给子View处理。
处理事件

两种方式实现轮播图

  • 1、利用 scrollTo scrollBy 完成轮播图的手动轮播

    • 1: 滑动之前的x坐标和滑动之后的x坐标,求出此次过程中移动的距离,利用scrollBy 方法实现图片的滑动。

    • 2: 刚开始坐标是固定的。

    • 3: 在不断滑动的过程中,会不断的调用ACTION_MOVE 方法,此时将移动之前的值和之后的值进行保存,算出移动的距离。

    • 4: 在抬起时,计算需要滑动到哪张图片上。

    • scrollTo(int x,int y):
      假设偏移位置发生了改变,就会给mScrollX和mScrollY赋新值,改变当前位置。
      注意:x,y代表的不是坐标点。而是偏移量。
      比如:
      我要移动view到坐标点(100,100),那么我的偏移量就是(0,,0) - (100,100) = (-100 ,-100) ,我就要运行view.scrollTo(-100,-100),达到这个效果。

    • scrollBy(int x,int y):
      表示在原先偏移的基础上在发生偏移,通俗的说就是相对我们当前位置偏移。

    • 当手指从屏幕左侧even.getX的值是由0往正数加的 所以scrollBy里是-distance(viewgroup里的的内容相较于屏幕是往左移所以是-)。而getScrollX的值和even.getX是刚好相反的,当手指从屏幕左侧往右滑动的时候,getScrollX的值是从0变为负数,所以求index的时候可以直接用该值去加屏幕的一半。

  • 2、利用 scroller 对象 完成轮播图的手动轮播

    • 创建scroller对象
        scroller = new Scroller(getContext());
      
    • 必须实现computeScroll方法
computeScroll
scroller.startScroll

实现自动轮播效果

  • 使用Timer、 TimeTask、Handler三者结合实现自动轮播效果

  • 开启任务


    Timer、 TimeTask
  • 发送信息


    Handler

创建FragemntLayout

  • 1、继承三个构造方法
三个构造方法
  • 2、添加BannerGroupView视图
BannerGroupView
  • 3、添加DotImageView视图
DotImageView
  • 4、添加数据源并布局
添加数据源并布局

加载底部的圆点指示器

  • 创建资源文件
    • 正常的圆点
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:color= "@android:color/white" />
    <size android:height="7.5dp" android:width="7.5dp"/>
</shape>
  • 高亮的圆点
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:color= "@android:color/holo_green_light" />
    <size android:height="7.5dp" android:width="7.5dp"/>
</shape>

选中事件回调处理

选中事件回调处理
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容