11a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy/* 21a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * Copyright (C) 2010 The Android Open Source Project 31a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * 41a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 51a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * you may not use this file except in compliance with the License. 61a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * You may obtain a copy of the License at 71a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * 81a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 91a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * 101a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * Unless required by applicable law or agreed to in writing, software 111a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 121a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * See the License for the specific language governing permissions and 141a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy * limitations under the License. 151a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy */ 161a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 171a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guypackage com.android.test.hwui; 181a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 191a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guyimport android.animation.ObjectAnimator; 201a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guyimport android.app.Activity; 211a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guyimport android.content.Context; 221a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guyimport android.graphics.Bitmap; 231a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guyimport android.graphics.Canvas; 241a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guyimport android.graphics.Paint; 251a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guyimport android.os.Bundle; 261a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guyimport android.view.Gravity; 271a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guyimport android.view.View; 281a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guyimport android.widget.FrameLayout; 291a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 301a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy@SuppressWarnings({"UnusedDeclaration"}) 311a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guypublic class BitmapMutateActivity extends Activity { 321a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy private static final int PATTERN_SIZE = 400; 331a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 341a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy private ObjectAnimator mAnimator; 351a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 361a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy @Override 371a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy protected void onCreate(Bundle savedInstanceState) { 381a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy super.onCreate(savedInstanceState); 391a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy final BitmapsView view = new BitmapsView(this); 401a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy final FrameLayout layout = new FrameLayout(this); 411a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 421a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy layout.addView(view, new FrameLayout.LayoutParams(480, 800, Gravity.CENTER)); 431a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 441a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy setContentView(layout); 451a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 461a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mAnimator = ObjectAnimator.ofInt(view, "offset", 0, PATTERN_SIZE - 1); 471a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mAnimator.setDuration(1500); 481a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mAnimator.setRepeatCount(ObjectAnimator.INFINITE); 491a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mAnimator.setRepeatMode(ObjectAnimator.REVERSE); 501a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mAnimator.start(); 511a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy } 521a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 531a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy @Override 541a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy protected void onDestroy() { 551a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy super.onDestroy(); 561a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mAnimator.cancel(); 571a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy } 581a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 591a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy static class BitmapsView extends View { 601a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy private final Paint mBitmapPaint; 611a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy private final Bitmap mBitmap1; 621a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy private final int[] mPixels; 631a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 641a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy private int mOffset; 651a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy private int mSlice; 661a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy private static final int[] mShifts = new int[] { 16, 8, 0 }; 671a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 681a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy BitmapsView(Context c) { 691a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy super(c); 701a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 711a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mBitmap1 = Bitmap.createBitmap(PATTERN_SIZE, PATTERN_SIZE, Bitmap.Config.ARGB_8888); 721a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mBitmapPaint = new Paint(); 731a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 741a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mPixels = new int[mBitmap1.getWidth() * mBitmap1.getHeight()]; 751a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mSlice = mBitmap1.getWidth() / 3; 761a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy } 771a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 781a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy public void setOffset(int offset) { 791a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mOffset = offset; 801a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy invalidate(); 811a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy } 821a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 831a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy @Override 841a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy protected void onDraw(Canvas canvas) { 851a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy super.onDraw(canvas); 861a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 871a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy int width = mBitmap1.getWidth(); 881a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy int height = mBitmap1.getHeight(); 891a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 90e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy canvas.translate((getWidth() - width) / 2, 0); 911a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 921a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy for (int x = 0; x < width; x++) { 931a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy int color = 0xff000000; 941a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy int i = x == 0 ? 0 : x - 1; 951a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy color |= (int) ((0xff * ((i + mOffset) % mSlice) / (float) mSlice)) << 961a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mShifts[i / mSlice]; 971a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy for (int y = 0; y < height; y++) { 981a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mPixels[y * width + x] = color; 991a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy } 1001a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy } 1011a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy 1021a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy mBitmap1.setPixels(mPixels, 0, width, 0, 0, width, height); 1031a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy canvas.drawBitmap(mBitmap1, 0.0f, 0.0f, mBitmapPaint); 104e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy 105e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy canvas.save(); 106e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy canvas.translate(0.0f, height + 32); 107e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy canvas.drawBitmap(mPixels, 0, width, 0.0f, 0.0f, width, height, false, mBitmapPaint); 108e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy canvas.restore(); 1091a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy } 1101a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy } 1111a81aea8144b92ebaf807af9de69a0ab3415a5aaRomain Guy} 112