1deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik/*
2deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik * Copyright (C) 2014 The Android Open Source Project
3deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik *
4deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
5deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik * you may not use this file except in compliance with the License.
6deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik * You may obtain a copy of the License at
7deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik *
8deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
9deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik *
10deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik * Unless required by applicable law or agreed to in writing, software
11deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
12deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik * See the License for the specific language governing permissions and
14deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik * limitations under the License.
15deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik */
16deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
17deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikpackage com.android.test.hwui;
18deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
19deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.animation.ObjectAnimator;
20deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.animation.ValueAnimator;
21deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.app.Activity;
22deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.content.Context;
23deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.graphics.Canvas;
24deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.graphics.Outline;
25deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.graphics.Path;
26deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.graphics.Rect;
27deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.os.Bundle;
2831ba192dd201df2cad96a8c503f730130ab0d80fChris Craikimport android.view.View;
2931ba192dd201df2cad96a8c503f730130ab0d80fChris Craikimport android.view.ViewOutlineProvider;
30deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.widget.FrameLayout;
31deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikimport android.widget.TextView;
32deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
33deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikpublic class ClipOutlineActivity extends Activity {
34deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    @Override
35deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    protected void onCreate(Bundle savedInstanceState) {
36deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        super.onCreate(savedInstanceState);
37deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
38deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        final RegionView group = new RegionView(this);
39deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
40deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        final TextView text = new TextView(this);
41deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        text.setText(buildText());
42deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        group.addView(text);
43deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
44deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        setContentView(group);
45deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
46deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        ObjectAnimator animator = ObjectAnimator.ofFloat(group, "clipPosition", 0.0f, 1.0f);
47deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        animator.setDuration(3000);
48deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        animator.setRepeatCount(ValueAnimator.INFINITE);
49deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        animator.setRepeatMode(ValueAnimator.REVERSE);
50deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        animator.start();
51deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    }
52deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
53deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    private static CharSequence buildText() {
54deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        StringBuffer buffer = new StringBuffer();
55deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        for (int i = 0; i < 10; i++) {
56deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik            buffer.append(LOREM_IPSUM);
57deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        }
58deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        return buffer;
59deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    }
60deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
61deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    public static class RegionView extends FrameLayout {
62deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        private float mClipPosition = 0.0f;
63deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        private Rect mRect = new Rect();
64deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
65deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        public RegionView(Context c) {
66deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik            super(c);
6731ba192dd201df2cad96a8c503f730130ab0d80fChris Craik            setOutlineProvider(new ViewOutlineProvider() {
6831ba192dd201df2cad96a8c503f730130ab0d80fChris Craik
6931ba192dd201df2cad96a8c503f730130ab0d80fChris Craik                @Override
7031ba192dd201df2cad96a8c503f730130ab0d80fChris Craik                public void getOutline(View view, Outline outline) {
7131ba192dd201df2cad96a8c503f730130ab0d80fChris Craik                    int w = getWidth() / 2;
7231ba192dd201df2cad96a8c503f730130ab0d80fChris Craik                    int h = getHeight() / 2;
7331ba192dd201df2cad96a8c503f730130ab0d80fChris Craik
7431ba192dd201df2cad96a8c503f730130ab0d80fChris Craik                    mRect.set(0, 0, w, h);
7531ba192dd201df2cad96a8c503f730130ab0d80fChris Craik                    mRect.offset((int) (mClipPosition * w), getHeight() / 4);
7631ba192dd201df2cad96a8c503f730130ab0d80fChris Craik
7731ba192dd201df2cad96a8c503f730130ab0d80fChris Craik                    outline.setRoundRect(mRect, w / 2);
7831ba192dd201df2cad96a8c503f730130ab0d80fChris Craik                }
7931ba192dd201df2cad96a8c503f730130ab0d80fChris Craik            });
80deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik            setClipToOutline(true);
81deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        }
82deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
83deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        public float getClipPosition() {
84deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik            return mClipPosition;
85deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        }
86deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
87deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        public void setClipPosition(float clipPosition) {
88deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik            mClipPosition = clipPosition;
8931ba192dd201df2cad96a8c503f730130ab0d80fChris Craik            invalidateOutline();
90deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        }
91deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    }
92deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
93deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    private static final String LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sagittis molestie aliquam. Donec metus metus, laoreet nec sagittis vitae, ultricies sit amet eros. Suspendisse sed massa sit amet felis consectetur gravida. In vitae erat mi, in egestas nisl. Phasellus quis ipsum massa, at scelerisque arcu. Nam lectus est, pellentesque eget lacinia non, congue vitae augue. Aliquam erat volutpat. Pellentesque bibendum tincidunt viverra. Aliquam erat volutpat. Maecenas pretium vulputate placerat. Nulla varius elementum rutrum. Aenean mollis blandit imperdiet. Pellentesque interdum fringilla ligula.";
94deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik}
95