1/* 2 * Copyright (C) 2013 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 */ 16package com.android.framesequence.samples; 17 18import android.app.Activity; 19import android.graphics.Bitmap; 20import android.os.Bundle; 21import android.support.rastermill.FrameSequence; 22import android.support.rastermill.FrameSequenceDrawable; 23import android.view.View; 24import android.widget.Toast; 25 26import java.io.InputStream; 27import java.util.HashSet; 28 29public class FrameSequenceTest extends Activity { 30 FrameSequenceDrawable mDrawable; 31 int mResourceId; 32 33 // This provider is entirely unnecessary, just here to validate the acquire/release process 34 private class CheckingProvider implements FrameSequenceDrawable.BitmapProvider { 35 HashSet<Bitmap> mBitmaps = new HashSet<Bitmap>(); 36 @Override 37 public Bitmap acquireBitmap(int minWidth, int minHeight) { 38 Bitmap bitmap = 39 Bitmap.createBitmap(minWidth + 1, minHeight + 4, Bitmap.Config.ARGB_8888); 40 mBitmaps.add(bitmap); 41 return bitmap; 42 } 43 44 @Override 45 public void releaseBitmap(Bitmap bitmap) { 46 if (!mBitmaps.contains(bitmap)) throw new IllegalStateException(); 47 mBitmaps.remove(bitmap); 48 bitmap.recycle(); 49 } 50 51 public boolean isEmpty() { 52 return mBitmaps.isEmpty(); 53 } 54 } 55 56 final CheckingProvider mProvider = new CheckingProvider(); 57 58 @Override 59 public void onCreate(Bundle savedInstanceState) { 60 super.onCreate(savedInstanceState); 61 62 mResourceId = getIntent().getIntExtra("resourceId", R.raw.animated_gif); 63 64 setContentView(R.layout.basic_test_activity); 65 findViewById(R.id.start).setOnClickListener(new View.OnClickListener() { 66 @Override 67 public void onClick(View view) { 68 mDrawable.start(); 69 } 70 }); 71 findViewById(R.id.stop).setOnClickListener(new View.OnClickListener() { 72 @Override 73 public void onClick(View view) { 74 mDrawable.stop(); 75 } 76 }); 77 findViewById(R.id.vis).setOnClickListener(new View.OnClickListener() { 78 @Override 79 public void onClick(View view) { 80 mDrawable.setVisible(true, true); 81 } 82 }); 83 findViewById(R.id.invis).setOnClickListener(new View.OnClickListener() { 84 @Override 85 public void onClick(View view) { 86 mDrawable.setVisible(false, true); 87 } 88 }); 89 findViewById(R.id.circle_mask).setOnClickListener(new View.OnClickListener() { 90 @Override 91 public void onClick(View view) { 92 mDrawable.setCircleMaskEnabled(!mDrawable.getCircleMaskEnabled()); 93 } 94 }); 95 } 96 97 @Override 98 protected void onResume() { 99 super.onResume(); 100 101 View drawableView = findViewById(R.id.drawableview); 102 InputStream is = getResources().openRawResource(mResourceId); 103 104 FrameSequence fs = FrameSequence.decodeStream(is); 105 mDrawable = new FrameSequenceDrawable(fs, mProvider); 106 mDrawable.setOnFinishedListener(new FrameSequenceDrawable.OnFinishedListener() { 107 @Override 108 public void onFinished(FrameSequenceDrawable drawable) { 109 Toast.makeText(getApplicationContext(), 110 "The animation has finished", Toast.LENGTH_SHORT).show(); 111 } 112 }); 113 drawableView.setBackgroundDrawable(mDrawable); 114 } 115 116 @Override 117 protected void onPause() { 118 super.onPause(); 119 View drawableView = findViewById(R.id.drawableview); 120 121 mDrawable.destroy(); 122 if (!mProvider.isEmpty()) throw new IllegalStateException("All bitmaps not recycled"); 123 124 mDrawable = null; 125 drawableView.setBackgroundDrawable(null); 126 } 127} 128