【问题标题】:showing image when clicked from GridView in smartphone image viewer在智能手机图像查看器中从 GridView 单击时显示图像
【发布时间】:2015-10-24 18:44:06
【问题描述】:

我创建了一个 android 应用程序,用于在 gridview 中显示在线图像。该应用程序运行良好,图像显示在 GridView 中。问题是当我们单击 GridView 中的特定图像时,我想在默认图像查看器中显示图像。

谁能告诉我一些建议

我的代码如下所示

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        setContentView(R.layout.activity_main);

        GridView gridview = (GridView) findViewById(R.id.gridView1);
        gridview.setAdapter(new ImageAdapter(this));

        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                Intent mInDisplay = new Intent(MainActivity.this, MainActivity.class);
                // how to show the selected image in default image viewer
            }
        });
    }

    public class ImageAdapter extends BaseAdapter {
        /** The parent context */
        private Context myContext;

        /** URL-Strings to some remote images. */
        private String[] myRemoteImages = {
                "http://www.example.com/uploads/gallery/sample1.jpg",
                "http://www.example.com//uploads/gallery/sample2.jpg",
                "http://www.example.com//uploads/gallery/sample3.jpg",
                "http://www.example.com//uploads/gallery/sample4.jpg",
                "http://www.example.com//uploads/gallery/sample5.jpg",
                "http://www.example.com//uploads/gallery/sample6.jpg",
                "http://www.example.com//uploads/gallery/sample7.jpg",
                "http://www.example.com//uploads/gallery/sample8.jpg",
                "http://www.example.com//uploads/gallery/sample9.jpg" };

        /** Simple Constructor saving the 'parent' context. */
        public ImageAdapter(Context c) {
            this.myContext = c;
        }

        /** Returns the amount of images we have defined. */
        public int getCount() {
            return this.myRemoteImages.length;
        }

        /* Use the array-Positions as unique IDs */
        public Object getItem(int position) {
            return position;
        }

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

        /**
         * Returns a new ImageView to be displayed, depending on the position
         * passed.
         */
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = new ImageView(this.myContext);

            try {
                /* Open a new URL and get the InputStream to load data from it. */
                URL aURL = new URL(myRemoteImages[position]);
                URLConnection conn = aURL.openConnection();
                conn.connect();
                InputStream is = conn.getInputStream();
                /* Buffered is always good for a performance plus. */
                BufferedInputStream bis = new BufferedInputStream(is);
                /* Decode url-data to a bitmap. */
                Bitmap bm = BitmapFactory.decodeStream(bis);
                bis.close();
                is.close();
                /* Apply the Bitmap to the ImageView that will be returned. */
                i.setImageBitmap(bm);
            } catch (IOException e) {
                i.setImageResource(R.drawable.ic_launcher);
                Log.e("DEBUGTAG", "Remtoe Image Exception", e);
            }

            /* Image should be scaled as width/height are set. */
            i.setScaleType(ImageView.ScaleType.FIT_CENTER);
            /* Set the Width/Height of the ImageView. */
            i.setLayoutParams(new GridView.LayoutParams(150, 150));
            return i;
        }

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

【问题讨论】:

  • 为什么要投反对票?....我做错了吗
  • 反对反对者的赞成票

标签: java android image gridview


【解决方案1】:

要通过默认图像查看器显示您的图像,您需要将图像存储在您的设备中。

所以我建议您将图像保存在本地(可能是临时的),然后使用ACTION_VIEW 打开一个意图。

保存位图(source):

    private String saveToInternalSorage(Bitmap bitmapImage){
            ContextWrapper cw = new ContextWrapper(getApplicationContext());
             // path to /data/data/yourapp/app_data/imageDir
            File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
            // Create imageDir
            File mypath=new File(directory,"profile.jpg");

            FileOutputStream fos = null;
            try {           

                fos = new FileOutputStream(mypath);

           // Use the compress method on the BitMap object to write image to the OutputStream
                bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return directory.getAbsolutePath();
    }

查看您的图片:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("thePathReturnedFromPreviousMethod"), "image/*");
startActivity(intent);

【讨论】:

  • @Rani 感谢您的回答,问题是我有 n 个图像可能是 100 和 1000 ,因此保存所有单击下的图像不是最好的方法,我们还有其他选择吗,我打算使用默认的图像查看器,以便我们可以放大和缩小,因为大多数图像都是大尺寸的。
  • 如果您想使用默认图像查看器,我认为没有其他解决方案。但是你不需要保存所有的图像,你可以使用一些缓存机制。例如:保存可见图像+(下一个和上一个)5,然后在您的适配器中使用异步任务保存/删除图像。
  • Here 就是一个例子,你可以从中获得启发。
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多