1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.test.hwui;
18 
19 import android.animation.ObjectAnimator;
20 import android.app.Activity;
21 import android.content.Context;
22 import android.graphics.Bitmap;
23 import android.graphics.Canvas;
24 import android.graphics.Paint;
25 import android.os.Bundle;
26 import android.view.Gravity;
27 import android.view.View;
28 import android.widget.FrameLayout;
29 
30 @SuppressWarnings({"UnusedDeclaration"})
31 public class BitmapMutateActivity extends Activity {
32     private static final int PATTERN_SIZE = 400;
33 
34     private ObjectAnimator mAnimator;
35 
36     @Override
onCreate(Bundle savedInstanceState)37     protected void onCreate(Bundle savedInstanceState) {
38         super.onCreate(savedInstanceState);
39         final BitmapsView view = new BitmapsView(this);
40         final FrameLayout layout = new FrameLayout(this);
41 
42         layout.addView(view, new FrameLayout.LayoutParams(480, 800, Gravity.CENTER));
43 
44         setContentView(layout);
45 
46         mAnimator = ObjectAnimator.ofInt(view, "offset", 0, PATTERN_SIZE - 1);
47         mAnimator.setDuration(1500);
48         mAnimator.setRepeatCount(ObjectAnimator.INFINITE);
49         mAnimator.setRepeatMode(ObjectAnimator.REVERSE);
50         mAnimator.start();
51     }
52 
53     @Override
onDestroy()54     protected void onDestroy() {
55         super.onDestroy();
56         mAnimator.cancel();
57     }
58 
59     static class BitmapsView extends View {
60         private final Paint mBitmapPaint;
61         private final Bitmap mBitmap1;
62         private final int[] mPixels;
63 
64         private int mOffset;
65         private int mSlice;
66         private static final int[] mShifts = new int[] { 16, 8, 0 };
67 
BitmapsView(Context c)68         BitmapsView(Context c) {
69             super(c);
70 
71             mBitmap1 = Bitmap.createBitmap(PATTERN_SIZE, PATTERN_SIZE, Bitmap.Config.ARGB_8888);
72             mBitmapPaint = new Paint();
73 
74             mPixels = new int[mBitmap1.getWidth() * mBitmap1.getHeight()];
75             mSlice = mBitmap1.getWidth() / 3;
76         }
77 
setOffset(int offset)78         public void setOffset(int offset) {
79             mOffset = offset;
80             invalidate();
81         }
82 
83         @Override
onDraw(Canvas canvas)84         protected void onDraw(Canvas canvas) {
85             super.onDraw(canvas);
86 
87             int width = mBitmap1.getWidth();
88             int height = mBitmap1.getHeight();
89 
90             canvas.translate((getWidth() - width) / 2, 0);
91 
92             for (int x = 0; x < width; x++) {
93                 int color = 0xff000000;
94                 int i = x == 0 ? 0 : x - 1;
95                 color |= (int) ((0xff * ((i + mOffset) % mSlice) / (float) mSlice)) <<
96                         mShifts[i / mSlice];
97                 for (int y = 0; y < height; y++) {
98                     mPixels[y * width + x] = color;
99                 }
100             }
101 
102             mBitmap1.setPixels(mPixels, 0, width, 0, 0, width, height);
103             canvas.drawBitmap(mBitmap1, 0.0f, 0.0f, mBitmapPaint);
104 
105             canvas.save();
106             canvas.translate(0.0f, height + 32);
107             canvas.drawBitmap(mPixels, 0, width, 0.0f, 0.0f, width, height, false, mBitmapPaint);
108             canvas.restore();
109         }
110     }
111 }
112