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