自定义控件实现-今日头条Android APP图集效果
前提
产品有个新需求,类似今日头条的图集效果 
大致看了下UI,大致就是ViewPager,横向滑动切换图片,纵向滑动移动图片,纵向超过一定距离,图片飞出,图集淡出动画退出,支持图片的双击放大。
思路
第一个问题就是图集详情页用什么实现?Activity?Fragment?还是一个复杂的View? 
我最初打算用Fragment的,因为觉得效率高,Fragment需要自己处理进入退出, 
今日头条使用了Activity,因为这个Activity可以显示前一个Activity,所以它一定是一个透明的Activity 
这个用自定义的Activity主题就可以实现
用Android的Layout Inspector 工具查看今日头条它的布局,使用到ViewPager 
我也打算继承ViewPager,然后处理不同的情况下的触摸事件,实现需求
具体实现
1 定义一个透明的Activity:
AndroidManifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lijian.FloatImage">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.lijian.FloatImage.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.lijian.FloatImage.ImagesActivity"
            android:theme="@style/ImagesAppDayTheme">
        </activity>
    </application>
</manifest>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lijian.FloatImage">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.lijian.FloatImage.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.lijian.FloatImage.ImagesActivity"
            android:theme="@style/ImagesAppDayTheme">
        </activity>
    </application>
</manifest>
可以看到,图集详情页使用了ImagesActivity 
它对应的主题是ImagesAppDayTheme,注意里面的几个关键参数,目的就是创建背景透明的Activity:
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <style name="ImagesAppDayTheme" parent="AppTheme">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowBackground">@color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@android:style/Animation</item>
    </style>
2 继承ViewPager的FloatViewPager
普通的ViewPager不能满足我们的需要,因为它只支持横向滑动切换。我们需要处理其他方向的触摸事件,然后处理。
这里我直接重写了ViewPager的public boolean dispatchTouchEvent(MotionEvent ev) { }方法, 
为什么呢?因为这里是ViewPager触摸事件分发的起点,比起使用onTouchEvent方法更灵活,方便。
我们知道一个完整的触摸操作一般 
由 ActionDown-》多个ActionMove-》ActionUp组成 
我们需要判断这个触摸操作到底是横向的还是纵向的, 
如果是横向的,直接调用父类ViewPager 
return super.dispatchTouchEvent(ev);,由它处理横向切换即可
对于纵向的触摸: 
我们需要计算触摸的 X,Y的距离,然后移动ViewPager,实现跟随手指的效果
如果手指抬起来,判断移动距离,距离大于一个比例,就ViewPager整体移动飞出,图集关闭
具体的实现,代码都有注释,如果你需要参考,清楚上述的思路,自己看代码,修改,符合自己需求是最快的。授人鱼不如授人渔
Github地址
https://github.com/bylijian/FloatImages
自定义控件实现-今日头条Android APP图集效果的更多相关文章
- 山寨今日头条的标题title效果
		
山寨今日头条的标题title效果 效果: 源码: // // ViewController.m // 今日头条 // // Created by YouXianMing on 14/11/26. // ...
 - PYTHON 爬虫笔记九:利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集(实战项目二)
		
利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集 目标站点分析 今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方 ...
 - Android之仿今日头条顶部导航栏效果
		
随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候像今日头条新闻客户端要显示的内容太多,而且又想在主界面全部显示出来,所以 ...
 - 今日头条移动app广告激活数据API对接完整Java代码实现供大家参考》》》项目随记
		
这是自毕业后的第一篇博客,希望自己今后能养成写博客的一个好习惯.最近公司为了加速APP推广,采取在外部平台(如:今日头条)进行广告投放的方式,进行用户引流.因此我们需要对广告的激活数据进行一个检测,跟 ...
 - <Android 应用 之路> 一个类似今日头条的APP
		
简介 最近花了一两天的时间完成一个简易的新闻头条客户端的应用,引用到了SwipeRefreshLayout,CircleImageView,RxAndroid,Picasso,PhotoPicker等 ...
 - 通过分析Ajax请求 抓取今日头条街拍图集
		
代码: import os import re import json import time from hashlib import md5 from multiprocessing import ...
 - 今日头条- iOS客户端 启动速度优化实践
		
版权声明 作者:今日头条iOS团队 原文:https://techblog.toutiao.com/2017/01/17/iosspeed/ 应用启动时间,直接影响用户对一款应用的判断和使用体验.头条 ...
 - 爬虫七之分析Ajax请求并爬取今日头条
		
爬取今日头条图片 这里只讨论出现的一些问题,代码在最下面github链接里. 首先,今日头条取消了"图集"这一选项,因此对于爬虫来说效率降低了很多: 在所有代码都完成后,也许是爬取 ...
 - android仿今日头条App、多种漂亮加载效果、选择器汇总、记事本App、Kotlin开发等源码
		
Android精选源码 android漂亮的加载效果 android各种 选择器 汇总源码 Android仿bilibili搜索框效果 Android记事本app.分类,涂鸦.添加图片或者其他附件 仿 ...
 
随机推荐
- ios 相机 自定义 相片的截取
			
前段时间公司需要做一个身份识别的功能,而系统相机无法满足要求,so自己自定义了. 上代码: .h文件 #import <UIKit/UIKit.h> #import <AVFound ...
 - CentOS 中文支持
			
其中通过 yum 方式安装的最简单快速: yum groupinstall "Chinese Support" 装完中文语言包之后,它不会自己变成中文,得修改文件/etc/sysc ...
 - css里面鼠标的形状-----》easyui哪点事
			
用css控制鼠标样式的语法如下:<span style="cursor:*">文本或其它页面元素</span>把 * 换成如下15个效果的一种: 下面是对这 ...
 - UITableView定制左滑效果
			
UITableViewRowAction类 object defines a single action to present when the user swipes horizontally in ...
 - 基于windows fiber的协程(coroutine)实现
			
一个非常简单,但是实用的协程实现,使用Windows的*Fiber函数族(linux可以稍微改一下用*context函数族). fco.h #ifndef _MSC_VER #error " ...
 - POJ_3264 Balanced Lineup 【线段树 + 区间查询】
			
一.题面 POJ3264 二.分析 典型的线段树的题,没有更新只有查询. 查询的时候需要注意的是,在判断区间是完全属于右子树还是左子树时,要根据建树的情况来选择,不然会出错.具体看代码 三.AC代码 ...
 - stark - 1 ⇲一些理念
			
⒈.django项目启动时,自定义执行某个py文件. 在任意的app的apps.py中的Config类中定义ready方法,并调用autodiscover_modules from django.ap ...
 - 2.6 Go 读取CSV
			
Go读取CSV文件,其内容被转换成字符串数组 package main import ( "encoding/csv" "fmt" "io/iouti ...
 - request.upload.addEventListener in not a function。
			
本人在使用vue开发一套后台系统时,碰到了一个上传文件的需求,因为平时做的上传是使用ajax的方式来进行上传. 现在是使用axios来进行上传,方式没有什么改变: npm i axios 直接上 ...
 - 【CSS】CSS Sprites (CSS 精灵) 技术
			
CSS Sprites CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不 ...