开始

本来想封装成框架,由于本次项目想要大量运用动效,改成介绍原理,可以有更多的自定义效果。

多面板

创建

所谓多面板,就是为了同时适配 PAD(大屏幕设备)以及PHONE(正常屏幕设备) 使用大量的Fragment或者CardView分割界面 的布局。 正常布局一般放在 res/layout 中,为了适配 PAD 要在res下再创建一个文件夹 res/layout-large 同时创建一同名的布局如图

使用

使用的时候和正常一样,当程序运行在PAD上时,系统会优先查找 res/layout-large 中的布局,如果没有,再到 res/layout 下查找。 显示适配以后,要进行逻辑适配。

代码中区别当前使用的是 layout-large 下的布局还是 layout 下的布局

通过 判断 两者布局的差异。比如 layout 下 使用一个面板

<FrameLayout
    android:id="@+id/panel_left"
    />

layout-large 下 使用两个个面板

<FrameLayout
    android:id="@+id/panel_left"
    />
<FrameLayout
    android:id="@+id/panel_right"
    />

通过判断 panel_right 是否存在 来判断使用哪一块布局

if(ViewGroup.findViewById(R.id.panel_right) != null ){
	//使用的 layout-large 下的布局
}else{
	//使用的 layout 下的布局
}

效果如下

波纹动效

源码及效果

源码:https://github.com/naman14/MaterialPowerMenu 效果:

场景

弹出对话框时 使用 波纹动效 遮盖全部界面,同时显示对话框。 对话框消失时 使用 回退波纹动效 揭示被遮盖的界面。

使用

类名: CircularRevealView (位于 库中 的View包下)

使用FrameLayout 再最上层 放一个 CircularRevealView,以达到 遮盖和揭示的 效果

遮盖 以及 揭示的 代码

//遮盖
private void launchPowerMenu(View v,int color) {
	//计算 view 的中心位置 Helper 与 CircularRevealView 同目录
	final Point p = Helper.getLocationInView(circularRevealView, v); 
	//参数 分别是 位置x,y,颜色,最小半径,动效时间,动效监听
	circularRevealView.reveal(p.x, p.y, color, v.getHeight() / 2, 400, null);
}
//揭示
private void hide(View v,int r_color){
	final Point p = Helper.getLocationInView(circularRevealView, v);
	circularRevealView.hide(p.x,p.y,r_color,v.getHeight() / 2, 400, null);
}

共享元素

android 5.0 后自带的场景转换效果 效果如下

场景

activity 之间跳转,有相同元素时 如: 采购任务中的 产品名 以及 采购详情中的 产品名一致, 使用该效果

使用

public static void launch(AppCompatActivity activity, View transitionView){

	//配置跳转Intent
	Intent intent = new Intent(activity,NewActivity.class);
	//制动 跳出 activity 中的 元素 为共享元素 并为该元素指定名称
	ActivityOptionsCompat options = ActivityOptionsCompat
	.makeSceneTransitionAnimation(activity, transitionView, "tv");
	//启动跳转
	ActivityCompat.startActivity(activity, intent, options.toBundle());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_new);
	TextView tv = (TextView) findViewById(R.id.tv_hw);
	//制定跳入界面的共享元素 并 制定名称 (必需与跳出界面指定的元素名称一致)
	ViewCompat.setTransitionName(tv,"tv");
}

然后再 跳出 Activity 中 调用 launch

NewActivity.launch(MainActivity.this,tv);

options 可以配置多个 共享元素 intent 可以 配置 扩展参数 来专递 数据 所以 launch 的 参数 不要局限于这2个。

结束

更多有合适的动效 和 布局方式 , 再开发中 根据模块的情况使用。