使用TransitionDrawable为UI的背景切换添加交错渐变的过渡效果
上一篇介绍了如何使用RippleDrawable为UI添加点击水波纹效果
这一篇将作为介绍Drawable的第二篇,讲解如何使用TransitionDrawable来为UI背景切换设置交错渐变的过度效果。当你在加载显示一个ImageView或者更改一个UI的背景时,不希望切换的太过突然,希望添加一些类似于过渡效果的话,那么使用TransitionDrawable绝对是一个比较不错的选择,最起码比起在UI加载后强制使用一个动画要好一点,而且在代码上实现也更加简单。好了,废话不多说了,开始直接上代码。
首先在drawable目录下新建一个文件transition_drawable.xml
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/androi>
<item android:drawable="@color/color_gray" />
<item android:drawable="@color/colorAccent" />
</transition>
这个用作TextView背景切换时从灰色渐变过度到红色。
主布局文件:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:weightSum="1"
tools:context="com.example.transitiondrawable.MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal|center_vertical"
android:text="Hello World!" />
<ImageView
android:id="@+id/iv"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="40dp"
android:layout_marginTop="30dp"
android:contentDescription="null" />
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_gravity="center_horizontal"
android:gravity="center_vertical|center_horizontal"
android:text="@string/set_image" />
</LinearLayout>
这里的ImageView所使用的TransitionDrawable将使用java代码生成,通过点击button可以切换ImageView中显示的图片。
Activity代码如下:
package com.example.transitiondrawable;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView tv;
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
TransitionDrawable transitionDrawable = (TransitionDrawable) getResources().getDrawable(R.drawable.transition_drawable, null);
tv.setBackground(transitionDrawable);
transitionDrawable.startTransition(3000);
Resources res = getResources();
TransitionDrawable imageTransitionDrawable = new TransitionDrawable(new Drawable[]{res.getDrawable(R.drawable.third,null),
res.getDrawable(R.drawable.fourth,null)});
iv = (ImageView)findViewById(R.id.iv);
iv.setImageDrawable(imageTransitionDrawable);
imageTransitionDrawable.startTransition(3000);
Drawable a = iv.getDrawable();
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(iv.getDrawable() instanceof TransitionDrawable){
TransitionDrawable transitionDrawable = (TransitionDrawable) iv.getDrawable();
final Drawable first = transitionDrawable.getDrawable(1);
TransitionDrawable btnTransitionDrawable = new TransitionDrawable(new Drawable[]{first,getResources().getDrawable(R.drawable.fifth)});
iv.setImageDrawable(btnTransitionDrawable);
btnTransitionDrawable.startTransition(5000);
}else{
final Drawable first = iv.getDrawable();
TransitionDrawable btnTransitionDrawable = new TransitionDrawable(new Drawable[]{first,getResources().getDrawable(R.drawable.fifth)});
iv.setImageDrawable(btnTransitionDrawable);
btnTransitionDrawable.startTransition(5000);
}
}
});
}
}
代码也很简单,我写的可能有点乱,通过set方法将TransitionDrawable设置为背景或者要显示的图画,然后调用TransitionDrawable中的startTransition方法,传入的参数为渐变过程的时间。
效果图如下:
基本上就是这些东西,涉及到东西不多,关于TransitionDrawable方面的东西就讲到这里,有兴趣的小伙伴可以追一下系统源码,看一下是如何实现的。
这是我的微信公众号,如果可以的话,希望您可以关注一下,这将是对我最大的鼓励,谢谢!!
源码已经上传至GitHub中,可以直接git clone获取源码!!!
源码地址,里面除了本篇blog的源码,还有其他的源码哦,不要弄错了!!!