2

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))); 
          } 



     }

    }
PaulH
  • 263
  • 2
  • 7
  • 18

1 Answers1

6

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);
}
Michell Bak
  • 13,182
  • 11
  • 64
  • 121
  • Yeah its based on the gallery widget. How would i set it out if say i clicked tablwtsplash2 to get to MainActivityb? Also can i do a separate click for each image to a different activity? Many Thanks – PaulH Feb 03 '12 at 09:03
  • If you want to switch to another Activity, just start a new Activity with an Intent. Anyway - try it. This is the way it's supposed to work. – Michell Bak Feb 03 '12 at 10:05
  • I've tried this : 'coverFlow.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { // fire intent finish(); // finish current activity Intent myIntent = new Intent(view.getContext(), MainbActivity.class); startActivityForResult(myIntent, 0); } });' – PaulH Feb 03 '12 at 18:32
  • You're finishing the current activity before launching the new one. That naturally won't work. – Michell Bak Feb 03 '12 at 18:35
  • It doesnt seem to like the view in (view.getContext)? It says view cannot be resolved. I'm not 100% sure if i'm putting it in the right [lace either? I'm Placing it straight after where i've asked to find the coverflow id. Sorry to keep asking about this, as i say the app is all good to go apart from this problem. Many Thanks. – PaulH Feb 03 '12 at 18:35
  • Use ClassName.this to get the context - or alternatively getApplicationContext(). – Michell Bak Feb 03 '12 at 18:37
  • Thank you!! Got it working with the getApplicationContext()!! The only thing now is how do I get it to go to a different activity depending on which image I press? i.e press splashtab2 go to MainActivityb, press splashtab3 go to MainActivityc etc? Many Thanks – PaulH Feb 03 '12 at 20:46
  • The arg2 parameter is the position of the click, starting from zero. So - if arg2 == 0, then it's the first picture, arg2 == 1 then it's the second and so forth. – Michell Bak Feb 03 '12 at 23:10
  • Where abouts would I put that into this code:coverFlow.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { Intent myIntent = new Intent(getApplicationContext(), MainbActivity.class); startActivityForResult(myIntent, 0); } }); – PaulH Feb 03 '12 at 23:50
  • I've just updated the answer to help you along. This is pretty basic Java, though - just a simple if/else. – Michell Bak Feb 04 '12 at 00:41
  • @PaulH, Hi, Even I got stuck with the same problem, can u share the code for me. Thanks in advance. – Randroid Apr 25 '12 at 12:28
  • @Raghav Everything you need to know is stated in the answer and comments. – Michell Bak Apr 25 '12 at 13:33
  • @Michell Bak, Thanks for the reply, but suppose If I have 10 drawable images then if I click on each image it should fire an intent with new activity. so my question is for 10 drawable images should we have 10 activities/class files? so that by clicking on each it will go to a new activity. Thanks in advance. – Randroid Apr 26 '12 at 04:43
  • @Raghav Yes, but only if you actually want to launch ten different activities. If you just want to launch one activity with slightly different content depending on the image, then do that and use Intent extras to include the position of the selected image in the Gallery. Yu can then retrieve the position in the new activity's onCreate method and use it to load a specfic image or something similar for that specific position. – Michell Bak Apr 26 '12 at 06:49