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