Android Coverflow OnClickListener - PullRequest
       25

Android Coverflow OnClickListener

2 голосов
/ 03 февраля 2012

Я создал приложение с coverflow. Я искал повсюду и не могу понять, как использовать onclicklistener, чтобы перейти к простому действию, когда вы нажимаете на каждое отдельное изображение в потоке обложки. Ниже приведен мой код, и я надеюсь, что кто-то может помочь, потому что приложение отлично подходит для решения этой 1 проблемы !!

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 Ответ

6 голосов
/ 03 февраля 2012

Ваш класс CoverFlow основан на виджете Gallery?Если это так, вы можете просто установить OnItemClickListener - который будет срабатывать при нажатии элемента в CoverFlow / Gallery.

Вот краткий пример:

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

Для начала деятельности на основе позиции:

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