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