【问题标题】:Android Coverflow OnClickListenerAndroid Coverflow OnClickListener
【发布时间】:2012-02-04 08:40:43
【问题描述】:

我创建了一个带有 Coverflow 的应用程序。当您单击封面流中的每个单独图像时,我到处寻找,似乎无法弄清楚如何使用 onclicklistener 来完成一个简单的活动。下面是我的代码,我希望有人能提供帮助,因为除了这 1 个问题之外,该应用程序都很好!!

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



     }

    }

【问题讨论】:

    标签: android image onclick coverflow


    【解决方案1】:

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

    【讨论】:

    • 是的,它基于图库小部件。如果说我单击 tablwtsplash2 进入 MainActivityb,我将如何设置它?我也可以为每个图像单独点击不同的活动吗?非常感谢
    • 如果要切换到另一个Activity,只需启动一个带有Intent的新Activity即可。无论如何 - 试试看。这是它应该工作的方式。
    • 我试过这个:'coverFlow.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { // 触发意图完成() ; // 完成当前活动 Intent myIntent = new Intent(view.getContext(), MainbActivity.class); startActivityForResult(myIntent, 0); } });'
    • 您正在完成当前活动,然后再启动新活动。这自然是行不通的。
    • 它似乎不喜欢(view.getContext)中的视图?它说视图无法解决。我不是 100% 确定我是否把它放在了正确的位置 [花边?我在我要求找到coverflow id的地方直接放置它。很抱歉一直问这个问题,因为我说这个应用程序除了这个问题之外都很好。非常感谢。
    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多