1db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase/* 2db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * Copyright (C) 2012 The Android Open Source Project 3db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * 4db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * you may not use this file except in compliance with the License. 6db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * You may obtain a copy of the License at 7db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * 8db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 9db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * 10db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * Unless required by applicable law or agreed to in writing, software 11db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * See the License for the specific language governing permissions and 14db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase * limitations under the License. 15db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase */ 16db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 17db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haasepackage com.android.test.hwui; 18db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 19db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.animation.ObjectAnimator; 20db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.animation.ValueAnimator; 21db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.app.Activity; 22db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.content.Context; 23db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.graphics.Canvas; 24db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.graphics.Color; 25db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.graphics.Paint; 26db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.os.Bundle; 27db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.Spannable; 28db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.SpannableStringBuilder; 29db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.style.BackgroundColorSpan; 30db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.style.ForegroundColorSpan; 31db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.style.ImageSpan; 32db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.style.SuggestionSpan; 33db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.text.style.UnderlineSpan; 34db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.view.View; 35db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.widget.Button; 36db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.widget.EditText; 37db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.widget.LinearLayout; 38db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haaseimport android.widget.TextView; 39db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 40db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haasepublic class ViewPropertyAlphaActivity extends Activity { 41db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 42db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase MyView myViewAlphaDefault, myViewAlphaHandled; 43db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 44db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase @Override 45db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase protected void onCreate(Bundle savedInstanceState) { 46db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase super.onCreate(savedInstanceState); 47db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 48db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase setContentView(R.layout.view_properties); 49db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 50db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase getWindow().getDecorView().postDelayed(new Runnable() { 51db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase @Override 52db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase public void run() { 53db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(R.id.button); 54db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(R.id.textview); 55db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(R.id.spantext); 56db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(R.id.edittext); 57db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(R.id.selectedtext); 58db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(R.id.textviewbackground); 59db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(R.id.layout); 60db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(R.id.imageview); 61db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(myViewAlphaDefault); 62db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(myViewAlphaHandled); 63db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase EditText selectedText = (EditText) findViewById(R.id.selectedtext); 64db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase selectedText.setSelection(3, 8); 65db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 66db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase }, 2000); 67db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 68db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase Button invalidator = (Button) findViewById(R.id.invalidateButton); 69db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase invalidator.setOnClickListener(new View.OnClickListener() { 70db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase @Override 71db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase public void onClick(View v) { 72db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase findViewById(R.id.textview).invalidate(); 73db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase findViewById(R.id.spantext).invalidate(); 74db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 75db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase }); 76db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 77db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase TextView textView = (TextView) findViewById(R.id.spantext); 78db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase if (textView != null) { 79db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase SpannableStringBuilder text = 80db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase new SpannableStringBuilder("Now this is a short text message with spans"); 81db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 82db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase text.setSpan(new BackgroundColorSpan(Color.RED), 0, 3, 83db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 84db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase text.setSpan(new ForegroundColorSpan(Color.BLUE), 4, 9, 85db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 86db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase text.setSpan(new SuggestionSpan(this, new String[]{"longer"}, 3), 11, 16, 87db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 88db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase text.setSpan(new UnderlineSpan(), 17, 20, 89db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 90db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase text.setSpan(new ImageSpan(this, R.drawable.icon), 21, 22, 91db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 92db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 93db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase textView.setText(text); 94db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 95db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 96db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase LinearLayout container = (LinearLayout) findViewById(R.id.container); 97db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase myViewAlphaDefault = new MyView(this, false); 98db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase myViewAlphaDefault.setLayoutParams(new LinearLayout.LayoutParams(75, 75)); 99db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase container.addView(myViewAlphaDefault); 100db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase myViewAlphaHandled = new MyView(this, true); 101db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase myViewAlphaHandled.setLayoutParams(new LinearLayout.LayoutParams(75, 75)); 102db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase container.addView(myViewAlphaHandled); 103db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 104db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 105db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase private void startAnim(View target) { 106db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase ObjectAnimator anim = ObjectAnimator.ofFloat(target, View.ALPHA, 0); 107db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase anim.setRepeatCount(ValueAnimator.INFINITE); 108db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase anim.setRepeatMode(ValueAnimator.REVERSE); 109db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase anim.setDuration(1000); 110db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase anim.start(); 111db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 112db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase private void startAnim(int id) { 113db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase startAnim(findViewById(id)); 114db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 115db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 116db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase private static class MyView extends View { 117db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase private int mMyAlpha = 255; 118db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase private boolean mHandleAlpha; 119db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 120db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 121db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase private MyView(Context context, boolean handleAlpha) { 122db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase super(context); 123db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase mHandleAlpha = handleAlpha; 124db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase mPaint.setColor(Color.RED); 125db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 126db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 127db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase @Override 128db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase protected void onDraw(Canvas canvas) { 129db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase if (mHandleAlpha) { 130db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase mPaint.setAlpha(mMyAlpha); 131db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 132db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase canvas.drawCircle(30, 30, 30, mPaint); 133db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 134db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 135db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase @Override 136db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase protected boolean onSetAlpha(int alpha) { 137db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase if (mHandleAlpha) { 138db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase mMyAlpha = alpha; 139db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase return true; 140db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 141db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase return super.onSetAlpha(alpha); 142db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 143db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase } 144db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 145db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase} 146