Android MD 式转场动画

最近在做MD设计风格的APP,所以在转场动画上当然也得符合MD了。下面就是效果图:

这里写图片描述

一开始并未了解过这种转场动画,原来是Google在SDK中已经给我们提供了。ActivityOptions是 Android 5.0 及以上使用的,但是也提供了ActivityOptionsCompat向下兼容。

下面我们就来看看吧:

layout_item.xml(ListView的item布局):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="10dp">

<ImageView
android:id="@+id/iv_img"
android:layout_width="90dip"
android:layout_height="65dip"
android:transitionName="photos"
android:padding="1dp" />

<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="2dp"
android:layout_toRightOf="@id/iv_img"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?android:attr/textColorPrimary"
tools:text="标题" />

<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv_title"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_toRightOf="@id/iv_img"
android:maxLines="2"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textColor="?android:attr/textColorPrimary"
tools:text="标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题" />

<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/tv_content"
android:maxLines="1"
android:text="2016-02-25 11:22:23"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textColor="?android:attr/textColorSecondary"
android:textSize="12sp" />

</RelativeLayout>
阅读更多

Android 联系人界面仿照

美团中选择城市的界面:

这里写图片描述

我们可以看到在右侧有一个支持快速索引的栏。接下来,我们就要实现这种索引栏。

首先是attrs.xml,定义了三个自定义属性:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="QuickIndexBar">
// 字体的颜色
<attr name="font_color" format="color|reference"></attr>
// 选中时字体的颜色
<attr name="selected_font_color" format="color|reference"></attr>
// 字体的大小
<attr name="font_size" format="dimension|reference"></attr>
</declare-styleable>
</resources>
阅读更多

Android 《Android群英传》笔记二

第六章:Android绘图机制与处理技巧

6.1 屏幕的尺寸信息

系统屏幕密度如下

  • ldpi—120—240X320分辨率
  • mdpi—160—320X480分辨率
  • hdpi—240—480X800分辨率
  • xhdpi—320—720X1280分辨率
阅读更多

Android WebView 中 JS 和 App 之间的交互

Native App 和 JS 交互

今天被问到了一个问题:在 WebView 中加载了一个网页,点击网页中的按钮,如何跳转到指定 Activity ?当时听到后脸上就写了大大的“懵逼”两个字,一时词穷,没回答上来。之前对 WebView 也没有更深入地了解,只是简单地用来加载网页而已。

之后在脑海中回想到 WebView 中的 JS 可以和 app 产生交互,于是搜索了一下,果然网上有类似的实现效果。看了一下,在这里就做一个简单的笔记了以便之后查看。

阅读更多

Android 使用 RecyclerView 实现仿喵街效果

效果图:

这里写图片描述

值得一提的是,这是旧版本的特效,新版本的喵街已经去掉了这种效果。

看完了效果,接下来就是动手的时间了。

我们先来分析一下思路:我们先给RecyclerView添加一个OnScrollListener,然后分别去获得firstVisiblePosition和firstCompletelyVisiblePosition。这里要注意一下,firstVisiblePosition是第一个在屏幕中可见的itemView对应的position,而firstCompletelyVisiblePosition是是第一个在屏幕中完全可见的itemView对应的position。之后在滚动中去动态地设置itemView的高度。整体的思路就这样了,下面我们直接来看代码。

阅读更多

Android 《Android群英传》笔记一

第三章:Android控件架构与自定义控件详解

3.1 Android控件架构

控件分为两类:View和ViewGroup,通过ViewGroup整个界面形成一个树形结构,并且ViewGroup负责对子View的测量与绘制以及传递交互事件。通常在Activity中使用的findViewById()方法,就是在控件树中以树的深度优先遍历来查找对应元素。在每颗控件树的顶部,都有一个ViewParent对象,这就是整棵树的控制核心,所有的交互管理事件都由它来统一调度和分配。

阅读更多

Android 自定义 View 实现可拖拽的 GridView 控件

在网易新闻中有一个新闻栏目管理,其中GridView的item是可以拖拽的,效果十分炫酷。具体效果如下图:

这里写图片描述

是不是也想自己也想实现出相同的效果呢?那就一起来往下看吧。

首先我们来梳理一下思路:

  1. 当用户长按选择一个item时,将该item隐藏,然后用WindowManager添加一个新的window,该window与所选择item一模一样,并且跟随用户手指滑动而不断改变位置。
  2. 当window的位置坐标在GridView里面时,使用pointToPosition (int x, int y)方法来判断对应的应该是哪个item,在adapter中作出数据集相应的变化,然后做出平移的动画。
阅读更多

Android AlertDialog 中 EditText 无法弹出键盘的解决方案

之前在做项目的过程中,有一个需求就是在AlertDialog中有EditText,可以在EditText中输入内容。但是在实际开发的过程中却发现,点击EditText却始终无法弹出键盘。因为之前在使用AlertDialog的时候,布局中并没有EditText,因此没有发现这个问题。这次算是填了一个隐藏的坑。

例如下面给出了一个例子,首先贴上AlertDialog的layout.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp"
android:layout_height="200dp"
android:background="@android:color/white"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello friend!"/>

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="input content" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="submit"/>

</LinearLayout>
阅读更多

Android 自定义 ViewGroup 实现流式布局

首先流式布局相信大家都见到过,比如说下图中的京东热搜就是流式布局的应用。还有更多应用的地方在这里就不一一举例了。

这里写图片描述

下面我们就来看看是如何实现的。首先新建一个class,继承自ViewGroup。在generateLayoutParams(AttributeSet attrs)里直接返回MarginLayoutParams就行了。

1
2
3
4
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new MarginLayoutParams(getContext(), attrs);
}
阅读更多

Android LayoutInflater 解析

前言

今天要讲的主角就是LayoutInflater,相信大家都用过吧。在动态地加载布局时,经常可以看见它的身影。比如说在Fragment的onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)方法里,就需要我们返回Fragment的View。这时就可以用inflater.inflate(R.layout.fragment_view, container, false)来加载视图。那么下面就来探究一下LayoutInflater的真面目吧。

阅读更多