本系列文章一共5篇
谁说Android的动画不廉价(一)之项目分层
谁说Android的动画不廉价(二)之转场动画
谁说Android的动画不廉价(三)之共享元素动画
谁说Android的动画不廉价(四)之元素动画
谁说Android的动画不廉价(五)之水波纹动画
GitHub源码
引言
本系列博文是阅读Material-Animations源码之后撰写的。我认为例子中的动画非常酷炫,但是代码写得有点不是很清晰。有兴趣的可以去阅读一下上面例子的源码,还是非常值得学习的。那么本系列博文主要是实现下面的效果。
效果图
- 第一种是
转场动画
,主要是用于Activity
切换的 - 第二种是
共享元素动画
,主要是切换Activity
的时候,使两个Activity
的某个元素产生动画关联 - 第三种是
元素动画
,主要是ViewGroup
里面的子View
发生变化时产生的动画 - 第四种是
水波纹动画
,用于View
,一个字就是帅。。。
项目分层
基本布局
tool_bar.xml
因为大量的
Activity
使用Toolbar
,所以我们使用include
的方式去添加Toolbar
。前提是要编写Toolbar
的布局文件。其他的布局就根据需要编写咯。
因为用到Toolbar,所以需要修改AndroidManifest.xml
文件中设置的主题
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolBar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:titleTextColor="#ffffff"></android.support.v7.widget.Toolbar>
基本Activity
BaseActivity.java
考虑到项目Activity的进一步复用,所以我们定义抽象基类
BaseActivity
。
package demo.august1996.top.transitionanimationsdemo.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewID());
beforeInitView();
initView();
initData();
}
protected void beforeInitView() {
}
protected abstract void initView();
protected void initData() {
}
protected abstract int getContentViewID();
}
getContentViewID
是返回布局文件的layoutID
其他几个函数的名字也能了解其对应的场景了吧?
ToolbarActivity.java
然后观察我们项目大多数
Activity
都是有Toolbar
的,所以我们就添加ToolbarActivity
基类,继承自BaseActivity
。
package demo.august1996.top.transitionanimationsdemo.Activity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import demo.august1996.top.transitionanimationsdemo.R;
public abstract class ToolbarActivity extends BaseActivity {
protected Toolbar mToolbar;
@Override
protected void beforeInitView() {
super.beforeInitView();
initToolbar();
}
private void initToolbar() {
mToolbar = (Toolbar) findViewById(R.id.toolBar);
setSupportActionBar(mToolbar);
getSupportActionBar().setTitle(getToolbarTitle());
if (canBack()) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finishAfterTransition();
}
});
}
}
protected boolean canBack() {
return false;
}
protected abstract String getToolbarTitle();
}
canBack
函数返回是否显示Toolbar
左上角的返回键。
总结
其实根本没什么总结,就是一个简单的项目分层。下一篇博文开始进行编写动画的代码。