我有一个应用程序,我想设置它的背景就像Instagram的登录页面,那个有"渐变颜色"。颜色是"移动"它会产生很酷的效果。这是我到目前为止所尝试的:
Count true: 3
Count false: 1
但这不起作用。发生的事情是,collors不会改变,它会保持黑色直到它到达最后protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_take_one);
colorFul = (RelativeLayout) findViewById(R.id.background);
GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TL_BR, new int[] {a,b});
gd.setCornerRadius(0f);
colorFul.setBackgroundDrawable(gd);
for(int i = 0; i<6; i++){
if(a == 0xff000000){
a = 0xff00ffff;
b = 0xff444444;
}else if(a == 0xff00ffff){
a = 0xff888888;
b = 0xff00ff00;
}else if(a == 0xff888888){
a = 0xffcccccc;
b = 0xffff00ff;
}else if(a==0xffcccccc){
a = 0xffff0000;
b = 0xffffffff;
}else if(a==0xffff0000){
a = 0xffffffff;
b = 0xffffff00;
}
System.out.println("||");
SystemClock.sleep(1000);
System.out.println(">");
}
}
然后背景变成白色和黄色(分别是collors 0xffffffff和0xffffff00),渐变形状。
那么,我该怎么做呢?我不在乎它是如何完成的。无论是使用GradientDrawable还是使用动画gif作为背景(它没有工作,gif保持静止)或任何其他方式。谢谢。
(This is what I want, the gif isn't that good but you can see how the background is changing it's color)
答案 0 :(得分:2)
您可以通过编程方式创建一些随时间改变渐变级别的内容,但这需要一些努力。或者,您可以使用TransitionDrawable在不同渐变之间淡入淡出,这应该产生类似的效果。
这可以实现如下:
<?xml version="1.0" encoding="UTF-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<!-- use two gradients, extending from opposite sides of the page-->
<item android:drawable="@drawable/gradientLeft" />
<item android:drawable="@drawable/gradientRight" />
</transition>
然后,您可以按如下方式激活代码中的转换:
TransitionDrawable transition = (TransitionDrawable) myLayout.getBackground();
transition.startTransition(1500);
显然,你可能需要花一些时间让它看起来像你想要的那样,但这比硬编码过渡算法容易得多!
以下完整和工作代码
所以,我实现了我的想法,它看起来很棒!我没想到它看起来很不错,但它真的很酷。我很无聊因此决定将整个事情推到一个函数中,这样你(和其他人)就可以更容易地利用它。
<强> MainActivity.java 强>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView image = (ImageView) findViewById(R.id.background);
Drawable backgrounds[] = new Drawable[3];
backgrounds[0] = ContextCompat.getDrawable(this, R.drawable.gradient1);
backgrounds[1] = ContextCompat.getDrawable(this, R.drawable.gradient2);
backgrounds[2] = ContextCompat.getDrawable(this, R.drawable.gradient3);
Crossfade(image, backgrounds, 10000);
}
public void Crossfade(final ImageView image, final Drawable layers[], final int speedInMs) {
class BackgroundGradientThread implements Runnable {
Context mainContext;
TransitionDrawable crossFader;
boolean first = true;
BackgroundGradientThread(Context c) {
mainContext = c;
}
public void run() {
Handler mHandler = new Handler(mainContext.getMainLooper());
boolean reverse = false;
while (true) {
if (!reverse) {
for (int i = 0; i < layers.length - 1; i++) {
Drawable tLayers[] = new Drawable[2];
tLayers[0] = layers[i];
tLayers[1] = layers[i + 1];
final TransitionDrawable tCrossFader = new TransitionDrawable(tLayers);
tCrossFader.setCrossFadeEnabled(true);
Runnable transitionRunnable = new Runnable() {
@Override
public void run() {
image.setImageDrawable(tCrossFader);
tCrossFader.startTransition(speedInMs);
}
};
mHandler.post(transitionRunnable);
try {
Thread.sleep(speedInMs);
} catch (Exception e) {
}
}
reverse = true;
}
else if (reverse) {
for (int i = layers.length - 1; i > 0; i--) {
Drawable tLayers[] = new Drawable[2];
tLayers[0] = layers[i];
tLayers[1] = layers[i - 1];
final TransitionDrawable tCrossFader = new TransitionDrawable(tLayers);
tCrossFader.setCrossFadeEnabled(true);
Runnable transitionRunnable = new Runnable() {
@Override
public void run() {
image.setImageDrawable(tCrossFader);
tCrossFader.startTransition(speedInMs);
}
};
mHandler.post(transitionRunnable);
try {
Thread.sleep(speedInMs);
} catch (Exception e) {
}
}
reverse = false;
}
}
}
}
Thread backgroundThread = new Thread(new BackgroundGradientThread(this));
backgroundThread.start();
}
}
<强> activity_main.xml中强>
<?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="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<ImageView android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/gradient2"
android:scaleType="fitXY"/>
<TextView android:text="Hello World!" android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
这里的主要功能是创建一个新的线程,它将自动开始来回移动两个图像。完成一次完整转换后,它将开始淡入原始图像。它在大多数情况下会产生非常平滑和流畅的效果,但在组合一些渐变可绘制时可能看起来很奇怪。该函数如下所示:
public void Crossfade(final ImageView image, final Drawable layers[], final int speedInMs)
1) final ImageView image
第一个参数应该是代表你背景的图像对象。
2) final Drawable layers[]
第二个参数采用一系列drawables,它应该是两个图像,就像我上面展示的那样。使用不同的渐变图像很有趣,并且非常有趣地观察颜色&#34; flow&#34;。但是要小心你的图像尺寸,因为我最初使用的是大量的图像,这些图像在应用程序中崩溃或者在动画过程中非常糟糕。
3) final int speedInMs
最后一个参数只表示从第一个drawable到第二个drawable完全转换所需的时间(以毫秒为单位)。
这里有一个GIF,这两个图像的交叉淡化速度为5000毫秒(注意:我不能在这里放一个10秒的GIF显示整个过渡,但它相当不错平滑):
编辑2:我在这里更新了Github和函数,但我刚刚添加了多绘图支持,因此可以添加任意数量的图像数组,并循环显示它们按时间顺序排列,直到达到最后,它将反转并重复。性感。