Menu
Woocommerce Menu

Android仿淘宝物流追踪,持续更新中

0 Comment


MainActivity

请注意这个库目前还处于早期阶段。

Widget.Material.开头的

<style name="Widget.Material.ProgressBar" parent="Widget.ProgressBar"> <item name="indeterminateDrawable">@drawable/progress_medium_material</item></style><style name="Widget.Material.ProgressBar.Inverse"/><style name="Widget.Material.ProgressBar.Horizontal" parent="Widget.ProgressBar.Horizontal"> <item name="progressDrawable">@drawable/progress_horizontal_material</item> <item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal_material</item> <item name="minHeight">16dip</item> <item name="maxHeight">16dip</item></style><style name="Widget.Material.ProgressBar.Small" parent="Widget.ProgressBar.Small"> <item name="indeterminateDrawable">@drawable/progress_small_material</item></style><style name="Widget.Material.ProgressBar.Small.Inverse"/><style name="Widget.Material.ProgressBar.Small.Title"/><style name="Widget.Material.ProgressBar.Large" parent="Widget.ProgressBar.Large"> <item name="indeterminateDrawable">@drawable/progress_large_material</item></style><style name="Widget.Material.ProgressBar.Large.Inverse"/>

看了网上的,有人说要什么自定义View啦,又是绘制,又是测量,其实没那么复杂,下面说说我是怎么解决的。想了想,可以各个view的相对位置来实现啊,比如,那个圆点也可以用imageview实现啊,唯一不同的就是竖线的view是穿过灰色的圆view的,大家有没有发现,除了第一个圆点意外的其他圆点,都是在那条水平的分割线下固定高度的位置(我这里好像是10dp)的左侧
,那我完全可以在这个分割线下方弄一个空的View,那么穿过圆孔的这条竖线不就是在这个空的View的上方,在圆点的下方,并且高度是match,这样,通过一个相对布局,这个时间轴的问题也解决了

图片 11487213085134461.png图片 21487213120578175.gif

相关文章阅读:

全面总结侧滑菜单的4种实现方式

万能的dialog库(包括类似popwindow效果) 自定义ViewPager实现3D画廊效果

简单几行代码让ViewPager实现垂直滑动效果

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff"> <ImageView android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="15dp" android:contentDescription="@null" android:scaleType="centerCrop" android:src="@mipmap/dot_red" /> <!--快件接收站点--> <TextView android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/dot_iv" android:layout_marginEnd="15dp" android:layout_marginStart="15dp" android:layout_toEndOf="@id/dot_iv" android:textColor="#666666" android:textSize="14sp" tools:text="快件已从杭州中转部发出" /> <!--快件接收时间--> <TextView android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@id/accept_station_tv" android:layout_below="@id/accept_station_tv" android:layout_marginEnd="15dp" android:layout_marginTop="10dp" android:textColor="#999999" android:textSize="12sp" tools:text="2017-05-15 10:59:04" /> <!--分割线--> <View android: android:layout_width="match_parent" android:layout_height="1dp" android:layout_alignStart="@id/accept_time_tv" android:layout_below="@id/accept_time_tv" android:layout_marginBottom="15dp" android:layout_marginTop="15dp" android:background="#eeeeee" /> <View android: android:layout_width="1dp" android:layout_height="1dp" android:layout_below="@id/divider_line_view" android:layout_marginStart="15dp" /> <!--时间轴的竖线--> <View android: android:layout_width="1dp" android:layout_height="match_parent" android:layout_above="@id/empty_view" android:layout_alignStart="@id/dot_iv" android:layout_below="@id/dot_iv" android:layout_marginStart="7dp" android:background="#eeeeee" /></RelativeLayout>

21.FlowLayout一个让子view在空间不够的情况下自动跳到下一行的布局。子view之间的间隔由FlowLayout计算出来,以便让view是均匀分布的。

Widget.Material.Light.开头的

<style name="Widget.Material.Light.ProgressBar" parent="Widget.Material.ProgressBar"/><style name="Widget.Material.Light.ProgressBar.Horizontal" parent="Widget.Material.ProgressBar.Horizontal"/><style name="Widget.Material.Light.ProgressBar.Small" parent="Widget.Material.ProgressBar.Small"/><style name="Widget.Material.Light.ProgressBar.Small.Title" parent="Widget.Material.ProgressBar.Small.Title"/><style name="Widget.Material.Light.ProgressBar.Large" parent="Widget.Material.ProgressBar.Large"/><style name="Widget.Material.Light.ProgressBar.Inverse" parent="Widget.Material.ProgressBar.Inverse"/><style name="Widget.Material.Light.ProgressBar.Small.Inverse" parent="Widget.Material.ProgressBar.Small.Inverse"/><style name="Widget.Material.Light.ProgressBar.Large.Inverse" parent="Widget.Material.ProgressBar.Large.Inverse"/>

4.styles_device_default.xml里面的13个,其中Widget.DeviceDefault.开头的有5个,Widget.DeviceDefault.Light.开头的有8个。


item_trace

1.Lottie这是一个能解析Adobe After
Effects动画导出的JSON文件并把它们渲染成本地动画的库。在Google Play
Store上有一个示例app。github上超过7500颗星,应该不会错!

其他属性
属性值 描述
android:max="" 进度条最大值
android:progress="" 进度条已完成值
android:secondaryProgress="" 二级进度值,值介于0到max。该进度在主进度和背景之间。比如用于网络播放视频时,二级进度用于表示缓冲进度,主进度用于表示播放进度。
android:animationResolution 超时的动画帧之间的毫秒 ;必须是一个整数值,如“100”。(已经被舍弃了,现在都不用了。)
android:progressDrawable="" 设置进度条轨道对应的drawable对象
android:indeterminate="" 是否允许使用不确定模式,该属性设置为true,表示设置进度条不精确显示进度,在不确定模式下,进度条动画无限循环
android:indeterminateDrawable="" 定义不确定模式是否可拉
android:indeterminateDuration="" 时间不定的动画
android:indeterminateBehavior="" 定义当进度达到最大时,不确定模式的表现;该值必须为repeat或者cycle,repeat表示进度从0重新开始;cycle表示进度保持当前值,并且回到0
android:indeterminateOnly="" 限制为不定模式
android:indeterminateTint=""
android:indeterminateTintMode=""

1.首先是布局代码:

 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:layout_width="match_parent" android:layout_height="match_parent" android:background="#3C7793" android:orientation="vertical"> <ProgressBar android: style="?android:attr/progressBarStyleHorizontal" android:layout_margin="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:progress="0" android:secondaryProgress="100" android:progressDrawable="@drawable/progressbar_line" /></LinearLayout>

2.再看drawable目录下的progressbar_line.xml是怎么定义的:(第一个item是背景,第二个item是二级进度值,一般用于视频的缓冲,最后一个是显示的进度)

 <layer-list xmlns:andro> <item android:> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#ff9d9e9d" android:centerColor="#ff5a5d5a" android:centerY="0.75" android:endColor="#ff747674" android:angle="0" /> </shape> </item> <item android:> <clip> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#80ffd300" android:centerColor="#80ffb600" android:centerY="0.75" android:endColor="#a0ffcb00" android:angle="0" /> </shape> </clip> </item> <item android:> <clip> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#80ff0000" android:endColor="#8000ff00" android:angle="0" /> </shape> </clip> </item> </layer-list>

3.代码里面控制进度的显示,新建一个线程,重写runnable,在run方法里面去模拟执行耗时操作,通过handler发消息给主线程,主线程拿到消息之后更新UI.

import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.widget.ProgressBar;public class MainActivity extends AppCompatActivity { private ProgressBar progressBar1; //在这里处理更新进度条 private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage; switch  { case 0x0001: progressBar1.setProgress; //如果进度小于100,则延迟100毫秒之后重复执行runnable if(msg.arg1<100){ mHandler.postDelayed; }else{ //否则,都置零,线程重新执行 progressBar1.setProgress; mHandler.post; } break; } } }; Runnable r = new Runnable() { int currentProgress = 0; @Override public void run() { Message msg = new Message(); msg.what = 0x0001; currentProgress = progressBar1.getProgress()+1; progressBar1.setProgress(currentProgress); msg.arg1 = currentProgress; mHandler.sendMessage; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); progressBar1 = (ProgressBar) findViewById(R.id.progressBar1); progressBar1.setProgressDrawable(getResources().getDrawable(R.drawable.progressbar_line)); if(progressBar1.getProgress() < progressBar1.getMax{ // 把r加入到线程队列,然后线程队列里就开始执行runnable对象中的run() mHandler.post; }else{//不用的时候,就把r从线程队列移除,这是一个小的性能优化 mHandler.removeCallbacks; } }}

1.先来看看布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:androandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="#3C7793"android:orientation="vertical"> <ProgressBar android: style="@android:style/Widget.ProgressBar" android:layout_margin="10dp" android:indeterminateDrawable="@drawable/progressbar_round" android:layout_width="100dp" android:layout_height="100dp" /></LinearLayout>

2.再看看drawable目录下的progressbar_round.xml

<?xml version="1.0" encoding="utf-8"?><rotate xmlns:andro android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="360"> <shape android:innerRadiusRatio="3" android:shape="ring" android:thicknessRatio="10" android:useLevel="false"> <gradient android:centerColor="#FFFFFF" android:centerY="0.50" android:endColor="#FFFF00" android:startColor="#00FFFF" android:type="sweep" android:useLevel="false" /> </shape></rotate>

效果图如下:

图片 3ProgressBar演示.gif

下一篇我们重点讲解如何写一个View继承ProgressBar,实现各种吊炸天的效果。

拿到这个图,大家首先想到的是这是一个RecyclerView来实现,可能比较疑惑的地方是那个红色的小圆点和灰色的小圆点,以及穿过圆点之间的那条竖线,最重要的是竖线的高度还是自适应的,并不是固定高度,老铁,自己说,有没有戳中你的痛点,要是能把这个时间轴线的问题解决了,你也可以说我上我也行。

图片 41487388435111357.gif

———————————————– Widget.Holo.开头的

<style name="Widget.Holo.ProgressBar" parent="Widget.ProgressBar"> <item name="indeterminateDrawable">@drawable/progress_medium_holo</item></style><style name="Widget.Holo.ProgressBar.Horizontal" parent="Widget.ProgressBar.Horizontal"> <item name="progressDrawable">@drawable/progress_horizontal_holo_dark</item> <item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal_holo</item> <item name="minHeight">16dip</item> <item name="maxHeight">16dip</item></style><style name="Widget.Holo.ProgressBar.Small" parent="Widget.ProgressBar.Small"> <item name="indeterminateDrawable">@drawable/progress_small_holo</item></style><style name="Widget.Holo.ProgressBar.Small.Title" /><style name="Widget.Holo.ProgressBar.Large" parent="Widget.ProgressBar.Large"> <item name="indeterminateDrawable">@drawable/progress_large_holo</item></style><style name="Widget.Holo.ProgressBar.Inverse" /><style name="Widget.Holo.ProgressBar.Small.Inverse" /><style name="Widget.Holo.ProgressBar.Large.Inverse" />

package com.zx.logisticsdemo;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.OrientationHelper;import android.support.v7.widget.RecyclerView;import java.util.ArrayList;import java.util.List;/** * 仿淘宝物流追踪效果 */public class MainActivity extends AppCompatActivity { private RecyclerView traceRv; //物流追踪列表 private List<Trace> mTraceList; //物流追踪列表的数据源 private TraceAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initRecyclerView(); } //加载物流信息的数据,这里是模拟一些假数据 private void initData() { mTraceList = new ArrayList<>(); mTraceList.add(new Trace(0, "2017年6月18日 上午12:04:01", "在湖北武汉洪山区光谷公司长江社区便民服务站进行签收扫描,快件已被 已签收 签收")); mTraceList.add(new Trace(1, "2017年6月18日 上午11:57:25", "在湖北武汉洪山区光谷公司长江社区便民服务站进行派件扫描;派送业务员:老王;联系电话:17786550311在湖北武汉洪山区光谷公司长江社区便民服务站进行派件扫描;派送业务员:老王;联系电话:17786550311")); mTraceList.add(new Trace(1, "2017年6月17日 下午4:43:29", "在湖北武汉洪山区光谷公司进行快件扫描,将发往:湖北武汉洪山区光谷公司长江社区便民服务站")); mTraceList.add(new Trace(1, "2017年6月17日 上午9:11:21", "从湖北武汉分拨中心发出,本次转运目的地:湖北武汉洪山区光谷公司")); mTraceList.add(new Trace(1, "2017年6月17日 上午1:53:14", "在湖南长沙分拨中心进行装车扫描,即将发往:湖北武汉分拨中心")); mTraceList.add(new Trace(1, "2017年6月17日 上午1:50:18", "在分拨中心湖南长沙分拨中心进行称重扫描")); mTraceList.add(new Trace(1, "2017年6月16日 上午11:27:58", "在湖南隆回县公司进行到件扫描")); } //初始化显示物流追踪的RecyclerView private void initRecyclerView() { traceRv = (RecyclerView) findViewById(R.id.traceRv); LinearLayoutManager layoutManager = new LinearLayoutManager(this, OrientationHelper.VERTICAL, false); mAdapter = new TraceAdapter(this, mTraceList); traceRv.setLayoutManager(layoutManager); traceRv.setAdapter; }}

25.Material About这是一个帮助你实现关于我界面的库。

ProgressBar是一个非常重要组件。通常用于向用户显示耗时操作完成的百分比。主要包括水平和圆形两种类型。讲解之前首先来讲一下样式属性设置,这个在自定义里面是核心部分。
本文主要介绍ProgressBar的属性里面的 progressDrawable 和
indeterminateDrawable

24.Shortbread这是一个这样的库为使用了@Shortcut注解的Activity和方法生成app
shortcuts。无需动用manifest, XML以及shortcut
manager。只需为想要shortcut调用的代码添加注释。目前是1.0.0 版本。

Widget.DeviceDefault.Light.开头的

<style name="Widget.DeviceDefault.Light.ProgressBar" parent="Widget.Material.Light.ProgressBar"/><style name="Widget.DeviceDefault.Light.ProgressBar.Horizontal" parent="Widget.Material.Light.ProgressBar.Horizontal"/><style name="Widget.DeviceDefault.Light.ProgressBar.Small" parent="Widget.Material.Light.ProgressBar.Small"/><style name="Widget.DeviceDefault.Light.ProgressBar.Small.Title" parent="Widget.Material.Light.ProgressBar.Small.Title"/><style name="Widget.DeviceDefault.Light.ProgressBar.Large" parent="Widget.Material.Light.ProgressBar.Large"/><style name="Widget.DeviceDefault.Light.ProgressBar.Inverse" parent="Widget.Material.Light.ProgressBar.Inverse"/><style name="Widget.DeviceDefault.Light.ProgressBar.Small.Inverse" parent="Widget.Material.Light.ProgressBar.Small.Inverse"/><style name="Widget.DeviceDefault.Light.ProgressBar.Large.Inverse" parent="Widget.Material.Light.ProgressBar.Large.Inverse"/>

图片 5仿淘宝物流.jpg

图片 6

关于style属性设置:安卓支持几种风格的进度条,通过style属性可以为ProgressBar设置指定风格,该属性可支持如下几个属性值:
  1. 安卓styles.xml里面的
    8个,这8个兼容不同系统版本,一般都用这些style样式用的多
属性值 属性的含义
style="@android:style/Widget.ProgressBar"
style="@android:style/Widget.ProgressBar.Large" 大环形进度条
style="@android:style/Widget.ProgressBar.Small" 小环形进度条
style="@android:style/Widget.ProgressBar.Inverse" 普通大小的环形进度条
style="@android:style/Widget.ProgressBar.Large.Inverse" 大环形进度条
style="@android:style/Widget.ProgressBar.Small.Inverse" 小环形进度条
style="@android:style/Widget.ProgressBar.Small.Title" 标题栏环形进度条
style="@android:style/Widget.ProgressBar.Horizontal" 水平进度条
<style name="Widget.ProgressBar"> <item name="indeterminateOnly">true</item> <item name="indeterminateDrawable">@drawable/progress_medium_white</item> <item name="indeterminateBehavior">repeat</item> <item name="indeterminateDuration">3500</item> <item name="minWidth">48dip</item> <item name="maxWidth">48dip</item> <item name="minHeight">48dip</item> <item name="maxHeight">48dip</item> <item name="mirrorForRtl">false</item></style><style name="Widget.ProgressBar.Large"> <item name="indeterminateDrawable">@drawable/progress_large_white</item> <item name="minWidth">76dip</item> <item name="maxWidth">76dip</item> <item name="minHeight">76dip</item> <item name="maxHeight">76dip</item></style><style name="Widget.ProgressBar.Small"> <item name="indeterminateDrawable">@drawable/progress_small_white</item> <item name="minWidth">16dip</item> <item name="maxWidth">16dip</item> <item name="minHeight">16dip</item> <item name="maxHeight">16dip</item></style><style name="Widget.ProgressBar.Inverse"> <item name="indeterminateDrawable">@drawable/progress_medium</item></style><style name="Widget.ProgressBar.Large.Inverse"> <item name="indeterminateDrawable">@drawable/progress_large</item></style><style name="Widget.ProgressBar.Small.Inverse"> <item name="indeterminateDrawable">@drawable/progress_small</item></style><style name="Widget.ProgressBar.Small.Title"> <item name="indeterminateDrawable">@drawable/progress_small_titlebar</item></style><style name="Widget.ProgressBar.Horizontal"> <item name="indeterminateOnly">false</item> <item name="progressDrawable">@drawable/progress_horizontal</item> <item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal</item> <item name="minHeight">20dip</item> <item name="maxHeight">20dip</item> <item name="mirrorForRtl">true</item></style>

2.styles_holo.xml里面的
16个,其中Widget.Holo.开头的有8个,Widget.Holo.Light.开头的有8个

Adapter

图片 71487388472619571.gif

Widget.DeviceDefault..开头的

<style name="Widget.DeviceDefault.ProgressBar" parent="Widget.Material.ProgressBar"/><style name="Widget.DeviceDefault.ProgressBar.Horizontal" parent="Widget.Material.ProgressBar.Horizontal"/><style name="Widget.DeviceDefault.ProgressBar.Small" parent="Widget.Material.ProgressBar.Small"/><style name="Widget.DeviceDefault.ProgressBar.Small.Title" parent="Widget.Material.ProgressBar.Small.Title"/><style name="Widget.DeviceDefault.ProgressBar.Large" parent="Widget.Material.ProgressBar.Large"/>

今天跟大家聊聊我心目中的物流追踪效果,效果图如下,有需要的朋友,可以直接带走,实现也没有想象中的那么复杂,特别是左边那个时间轴线,没那么复杂

14.ShimmerRecyclerView一个可以在加载数据的时候显示闪烁的RecyclerView。这个RecyclerView内置一个adapter,控制shimmer的外观。

Widget.Holo.Light.开头的

<style name="Widget.Holo.Light.ProgressBar" parent="Widget.Holo.ProgressBar" /><style name="Widget.Holo.Light.ProgressBar.Horizontal" parent="Widget.Holo.ProgressBar.Horizontal"> <item name="progressDrawable">@drawable/progress_horizontal_holo_light</item></style><style name="Widget.Holo.Light.ProgressBar.Small" parent="Widget.Holo.ProgressBar.Small" /><style name="Widget.Holo.Light.ProgressBar.Small.Title" parent="Widget.Holo.ProgressBar.Small.Title" /><style name="Widget.Holo.Light.ProgressBar.Large" parent="Widget.Holo.ProgressBar.Large" /><style name="Widget.Holo.Light.ProgressBar.Inverse" parent="Widget.Holo.ProgressBar.Inverse" /><style name="Widget.Holo.Light.ProgressBar.Small.Inverse" parent="Widget.Holo.ProgressBar.Small.Inverse" /><style name="Widget.Holo.Light.ProgressBar.Large.Inverse" parent="Widget.Holo.ProgressBar.Large.Inverse" />

3.styles_material.xml里面的
16个,其中Widget.Material.开头的有8个,Widget.Material.Light.开头的有8个


package com.zx.logisticsdemo;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import java.util.List;/** * 追踪物流列表的适配器 * <p> * 作者: 周旭 on 2017/5/24/0024. * 邮箱:374952705@qq.com * 博客:http://www.jianshu.com/u/56db5d78044d */public class TraceAdapter extends RecyclerView.Adapter<TraceAdapter.TraceViewHolder> { private static final int TYPE_CURR = 0; //当前 private static final int TYPE_NORMAL = 1; //历史记录 private Context mContext; private List<Trace> mList; private LayoutInflater inflater; public TraceAdapter(Context mContext, List<Trace> mList) { this.mContext = mContext; this.mList = mList; inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getItemCount() { return mList.size(); } @Override public TraceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new TraceViewHolder(inflater.inflate(R.layout.item_trace, parent, false)); } @Override public void onBindViewHolder(TraceViewHolder holder, int position) { //设置相关数据 Trace trace = mList.get; int type = trace.getType(); if (type == TYPE_CURR) { holder.acceptStationTv.setTextColor(mContext.getResources().getColor(R.color.color_c03)); holder.dotIv.setImageResource(R.mipmap.dot_red); } else if (type == TYPE_NORMAL) { holder.acceptStationTv.setTextColor(mContext.getResources().getColor(R.color.color_6)); holder.dotIv.setImageResource(R.mipmap.dot_black); } holder.acceptTimeTv.setText(trace.getAcceptTime; holder.acceptStationTv.setText(trace.getAcceptStation; if (position == mList.size { //最后一条数据,隐藏时间轴的竖线和水平的分割线 holder.timeLineView.setVisibility(View.INVISIBLE); holder.dividerLineView.setVisibility(View.INVISIBLE); } } public class TraceViewHolder extends RecyclerView.ViewHolder { private TextView acceptTimeTv; //接收时间 private TextView acceptStationTv; //接收地点 private ImageView dotIv; //当前位置 private View dividerLineView; //时间轴的竖线 private View timeLineView; //水平的分割线 public TraceViewHolder(View itemView) { super; acceptTimeTv =  itemView.findViewById(R.id.accept_time_tv); acceptStationTv =  itemView.findViewById(R.id.accept_station_tv); dotIv = (ImageView) itemView.findViewById(R.id.dot_iv); dividerLineView = itemView.findViewById(R.id.divider_line_view); timeLineView = itemView.findViewById(R.id.time_line_view); } }}

就是这些了。希望你能喜欢。如果你还知道任何其它在今年1,
2月份发布的库,请在评论告知。

图片 81487213406112859.png

11.CameraFragment一个集成了拍照功能的Fragment
,根据README:CameraFragment直接预览camera视图,并提供简单的API来捕获或者管理设备。你可以使用CameraFragment设置自己的布局以及控制camera。

图片 9

7.CoordinatorTabLayoutCoordinatorTabLayout是一个自定义的组合控件,帮助你快速实现TabLayout与CoordinatorLayout相结合的样式。效果见下面的gif图:

4.StoreStore是一个异步加载和缓存库。文档描述:Store是一个简化数据的请求,解析,保存,以及数据重试的类。一个Store类似于
仓库模式 ,不过用RxJava封装成了响应式的API,以支持单向数据流
。文档非常易懂,这个库值得尝试。你可以尝试各种flows,比如数据请求,缓存,解析等。

5.PreviewSeekBar如果你使用Google Play
Movies,你可能注意到了这个动画效果很棒,可以预览电影的SeekBar。 Rúben
Sousa
实现了这种效果并开源。下面的gif图片很好的说明了其功能。如果你的app是一个播放器,你决定应该试试。

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图