颜色"流动"在Android背景中

时间:2016-03-06 07:34:23

标签: android colors instagram gradient

我有一个应用程序,我想设置它的背景就像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

1 个答案:

答案 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>

<强> gradient1 / 2.JPG
gradient2.jpg gradient1.jpg

这里的主要功能是创建一个新的线程,它将自动开始来回移动两个图像。完成一次完整转换后,它将开始淡入原始图像。它在大多数情况下会产生非常平滑和流畅的效果,但在组合一些渐变可绘制时可能看起来很奇怪。该函数如下所示:

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显示整个过渡,但它相当不错平滑):

Super Flowy Colors

Github Link To Repository

编辑2:我在这里更新了Github和函数,但我刚刚添加了多绘图支持,因此可以添加任意数量的图像数组,并循环显示它们按时间顺序排列,直到达到最后,它将反转并重复。性感。