Android AIDL 分析

前言

在 Android 系统中,进程间通信 (IPC) 是一种很重要的机制。IPC 产生的原因是某些情况下需要在两个进程之间进行一些数据的交换。而在深入学习 Android 的过程中难免会遇到 IPC 的相关问题,比如常见的有在自己的应用程序中读取手机联系人的信息,这就涉及到 IPC 了。因为自己的应用程序是一个进程,通讯录也是一个进程,只不过获取通讯录的数据信息是通过 Content Provider 的方式来实现的。

对于初学者来说,在一开始接触 IPC 时可能会摸不着头脑,因为网上很多博客在讲 Android IPC 时通常都是长篇大论,没有从例子着手。基于以上种种原因以及希望对 AIDL 有一个更深入的理解,本篇博文就诞生了。在 Android 系统中,IPC 的方式有很多种,比如有 Messenger 、AIDL 和 ContentProvider 等。我们今天就来讲讲其中的 AIDL ,AIDL 也是比较常见和经常使用的一种 IPC 方式。

阅读更多

Android 实现滑动返回效果

前言

在如今 app 泛滥的年代里,越来越多的开发者注重用户体验这个方面了。其中,有很多的 app 都有一种功能,那就是滑动返回。比如知乎、百度贴吧等,用户在使用这一类的 app 都可以滑动返回上一个页面。不得不说这个设计很赞,是不是心动了呢?那就继续往下看吧!

在GitHub上有实现该效果的开源库 SwipeBackLayout ,可以看到该库发展得已经非常成熟了。仔细看源码你会惊奇地发现其中的奥秘,没错,正是借助了 ViewDragHelper 来实现滑动返回的效果。ViewDragHelper 我想不必多说了,在我的博客中有很多的效果都是通过它来实现的。那么,下面我们就使用 ViewDragHelper 来实现这个效果吧。

阅读更多

Android CursorAdapter 中的 filter 机制

CursorAdapter 类

首先我们来看一下 CursorAdapter 的继承以及实现关系:

1
2
3
public abstract class CursorAdapter extends BaseAdapter implements Filterable, CursorFilter.CursorFilterClient {

}
阅读更多

Android M 的运行时权限处理

之前有人在 Android 6.0 的机型上运行了 DragGridView 结果出异常奔溃了。想必问题的原因大家都知道,是 Android 6.0 新引入了在运行时权限申请(Runtime Permissions)的功能。那么这所谓的运行时申请权限究竟是怎么一回事呢,一起来看看吧!

在 Android 6.0 中,app 如果想要获得某些权限,会在应用中弹出一个对话框,让用户确认是否授予该权限。具体的截图如下:

Runtime Permissions screenshot

阅读更多

Android 九宫格解锁

前言

在平常使用手机的过程中,九宫格解锁是我们经常接触到的。常见的比如有锁屏中的九宫格,还有支付宝中的九宫格等。因为九宫格可以保护用户的隐私,所以它的应用面很广泛。那么今天我们就来自定义一个属于自己的九宫格吧!

首先我们来分析一下实现九宫格解锁的思路:当用户的手指触摸到某一个点时,先判断该点是否在九宫格的某一格范围之内,若在范围内,则该格变成选中的状态;之后用户手指滑动的时候,以该格的圆心为中心,用户手指为终点,两点连线。最后当用户手指抬起时,判断划过的九宫格密码是否和原先的密码匹配。

大致的思路流程就是上面这样的了,下面我们可以来实践一下。

阅读更多

Android 实现带视觉差的 ListView

什么是视差效果呢?一起来看效果图就知道了:

这里写图片描述

我们可以看到 ListView 的 HeaderView 会跟随 ListView 的滑动而变大,HeaderView里的图片会有缩放效果。这些可以使用属性动画来实现。接下来我们就来动手吧!

首先自定义几个属性,在之后可以用到:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ZoomListView">
<!-- headerView的高度 -->
<attr name="header_height" format="dimension|reference"></attr>
<!-- headerView的最大高度 -->
<attr name="header_max_height" format="dimension|reference"></attr>
<!-- headerView里面的图片最大的伸缩量 -->
<attr name="header_max_scale" format="float"></attr>
</declare-styleable>
</resources>
阅读更多

Android 实现美团的下拉刷新

给大家带来的是仿美团的下拉刷新。相信美团大家都用过,下面就贴出了美团的下拉刷新效果:

这里写图片描述

我们可以大致地分析一下:首先根据下拉改变的 paddingTop 来动态地缩放“绿色椭圆物”,然后当 headerView 的 paddingTop 大于0时,播放美团小人出现的帧动画,最后就是手指松开时播放刷新中的帧动画了。

基本上思路就是上面分析的那样了,那么我们下面一步就是要获取帧动画的素材了。我们先下载好美团的 apk ,解压后在 res/drawable-xhdpi-v4 里,我们可以得到相关的图片了。如果嫌麻烦,文末有本 Demo 的下载链接,里面就有素材图片。

阅读更多

Android FloatingActionButton 在滚动时显示或隐藏

在Material Design中,FloatingActionButton(即FAB)是一个很重要的元素。而通常在列表向下滚动的时候,FAB应该会隐藏;而在向上滚动时,FAB应该会显示出来。本篇就记录其中一种实现FAB显示或隐藏的方案,主要应用了属性动画。

其实关于FAB的显示和隐藏,Google官方就提供了其中一种方案:fab.hidden()fab.show()。但是自带的是FAB缩放的效果。并不是上下移动的效果。

那么我们就来看看如何实现FAB上下移动的效果吧!

首先在你想要滑动的View(比如说RecyclerView等)的布局上加上:

1
app:layout_behavior="@string/appbar_scrolling_view_behavior"
阅读更多

Android Scroller 滚动原理分析

Scroller来实现平滑滚动的效果。而我们今天就来探究一下为什么Scroller能够实现平滑滚动。

首先我们先来看一下Scroller的用法,基本可概括为“三部曲”:

  1. 创建一个Scroller对象,一般在View的构造器中创建:
1
2
3
4
5
6
7
8
9
10
11
12
public ScrollViewGroup(Context context) {
this(context, null);
}

public ScrollViewGroup(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public ScrollViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mScroller = new Scroller(context);
}
阅读更多

Android 《Android开发艺术探索》笔记一

第一章:Activity的生命周期和启动模式

1.1 Activity的生命周期全面分析

典型情况下的生命周期分析

onStart()和onStop()是从Activity是否可见这个角度来回调的,而onResume()和onPause()是从Activity是否位于前台这个角度来回调的。

阅读更多