Android Coverflow OnClickListener

3.5k Views Asked by At

I have created an app with coverflow. I have looked everywhere and can't seem to work out how to use an onclicklistener to get to just a simple activity when you click on each seperate image in the cover flow. Below is my code and i'm hoping somebody can help because the app is all good to go apart from this 1 problem!!

import java.io.FileInputStream;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Typeface;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ImageView.ScaleType;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CoverFlow coverFlow;
        coverFlow = new CoverFlow(this);

        coverFlow.setAdapter(new ImageAdapter(this));

        ImageAdapter coverImageAdapter =  new ImageAdapter(this);

        //coverImageAdapter.createReflectedImages();

        coverFlow.setAdapter(coverImageAdapter);

        coverFlow.setSpacing(-15);
        coverFlow.setSelection(4, true);
        coverFlow.setAnimationDuration(1000);


        setContentView(coverFlow);


        //Use this if you want to use XML layout file
        //setContentView(R.layout.main);
        //coverFlow =  (CoverFlow) findViewById(R.id.coverflow);
        setContentView(R.layout.main);

        Button main1 = (Button) findViewById(R.id.button1); 
        main1.setOnClickListener(new View.OnClickListener() { 
            public void onClick(View view) {
                 // fire intent
                finish(); // finish current activity
                Intent myIntent = new Intent(view.getContext(), 
                        MainActivity.class); 
                startActivityForResult(myIntent, 0);

            } 


        });

        Button main2 = (Button) findViewById(R.id.button2); 
        main2.setOnClickListener(new View.OnClickListener() { 
            public void onClick(View view) {
                 // fire intent
                finish(); // finish current activity
                Intent myIntent = new Intent(view.getContext(), 
                        MainbActivity.class); 
                startActivityForResult(myIntent, 0);

            } 


        });

        coverFlow =  (CoverFlow) findViewById(R.id.coverflow);
        coverFlow.setAdapter(coverImageAdapter);


    }

    public class ImageAdapter extends BaseAdapter {
         int mGalleryItemBackground;
         private Context mContext;

         private FileInputStream fis;

         private Integer[] mImageIds = {
           R.drawable.tabletsplash,
                 R.drawable.tabletsplash2,
                 R.drawable.tabletsplash3,
                 R.drawable.tabletsplash4,
                 R.drawable.tabletsplash5,
                 R.drawable.tabletsplash,
                 R.drawable.tabletsplash2,
                 R.drawable.tabletsplash3,
                 R.drawable.tabletsplash4,
                 R.drawable.tabletsplash5,
         };

         private ImageView[] mImages;

         public ImageAdapter(Context c) {
          mContext = c;
          mImages = new ImageView[mImageIds.length];
         }
      public boolean createReflectedImages() {
              //The gap we want between the reflection and the original image
              final int reflectionGap = 4;


              int index = 0;
              for (int imageId : mImageIds) {
            Bitmap originalImage = BitmapFactory.decodeResource(getResources(), 
              imageId);
               int width = originalImage.getWidth();
               int height = originalImage.getHeight();


               //This will not scale but will flip on the Y axis
               Matrix matrix = new Matrix();
               matrix.preScale(1, -1);

               //Create a Bitmap with the flip matrix applied to it.
               //We only want the bottom half of the image
               Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height/2, width, height/2, matrix, false);


               //Create a new bitmap with same width but taller to fit reflection
               Bitmap bitmapWithReflection = Bitmap.createBitmap(width 
                 , (height + height/2), Config.ARGB_8888);

              //Create a new Canvas with the bitmap that's big enough for
              //the image plus gap plus reflection
              Canvas canvas = new Canvas(bitmapWithReflection);
              //Draw in the original image
              canvas.drawBitmap(originalImage, 0, 0, null);
              //Draw in the gap
              Paint deafaultPaint = new Paint();
              canvas.drawRect(0, height, width, height + reflectionGap, deafaultPaint);
              //Draw in the reflection
              canvas.drawBitmap(reflectionImage,0, height + reflectionGap, null);

              //Create a shader that is a linear gradient that covers the reflection
              Paint paint = new Paint(); 
              LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0, 
                bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, 
                TileMode.CLAMP); 
              //Set the paint to use this shader (linear gradient)
              paint.setShader(shader); 
              //Set the Transfer mode to be porter duff and destination in
              paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 
              //Draw a rectangle using the paint with our linear gradient
              canvas.drawRect(0, height, width, 
                bitmapWithReflection.getHeight() + reflectionGap, paint); 

              ImageView imageView = new ImageView(mContext);
              imageView.setImageBitmap(bitmapWithReflection);
              imageView.setLayoutParams(new CoverFlow.LayoutParams(120, 180));
              imageView.setScaleType(ScaleType.MATRIX);
              mImages[index++] = imageView;

              }
           return true;
      }

         public int getCount() {
             return mImageIds.length;
         }

         public Object getItem(int position) {
             return position;
         }

         public long getItemId(int position) {
             return position;
         }

         public View getView(int position, View convertView, ViewGroup parent) {

          //Use this code if you want to load from resources
             ImageView i = new ImageView(mContext);
             i.setImageResource(mImageIds[position]);
             i.setLayoutParams(new CoverFlow.LayoutParams(300, 900));
             i.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 

             //Make sure we set anti-aliasing otherwise we get jaggies
             BitmapDrawable drawable = (BitmapDrawable) i.getDrawable();
             drawable.setAntiAlias(true);
             return i;

          //return mImages[position];
         }
       /** Returns the size (0.0f to 1.0f) of the views 
          * depending on the 'offset' to the center. */ 
          public float getScale(boolean focused, int offset) { 
            /* Formula: 1 / (2 ^ offset) */ 
              return Math.max(0, 1.0f / (float)Math.pow(2, Math.abs(offset))); 
          } 



     }

    }
1

There are 1 best solutions below

14
On BEST ANSWER

Is your CoverFlow class based on the Gallery widget? If so, you can just set an OnItemClickListener - that'll be fired when you press an item in the CoverFlow / Gallery.

Here's a quick example:

coverFlow.setOnItemClickListener(new OnItemClickListener(){
  @Override
  public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {
    // Do something }
  }
); 

To start activities based on the position:

if (arg2 == 0) {
    startActivityForResult(new Intent(getApplicationContext(), ActivityA.class), 0);
} else if (arg2 == 1) {
    startActivityForResult(new Intent(getApplicationContext(), ActivityB.class), 0);
}