【问题标题】:How to rotate an image in a Gallery view如何在图库视图中旋转图像
【发布时间】:2011-05-18 20:29:02
【问题描述】:

这是一个简单的问题,但我想知道它是否有一个不昂贵的解决方案。

我有一个图库视图,可以从内存(SD 卡或资源)加载图像。它们的大小为 480x800,因此代码对它们进行采样并在图库视图中显示为缩略图。一切正常,有点...

有些图片是横向的,有些是纵向的。画廊的 imageview 布局将它们全部显示为横向,因此所有纵向图像看起来都被严重拉伸了!

由于这些图像是抽象画,我想旋转肖像画,以便它们都很好且均匀地适合画廊。我可以通过比较它们的宽度和高度来检测它们的方向,然后使用 Matrix 和画布旋转纵向的方向,但这可能太昂贵且在 BaseAdapter 的 getView() 中运行速度太慢。

有人能想出更便宜的方法吗?

    public View getView(int position, View convertView, ViewGroup parent){   
        ImageView i = new ImageView(mContext);   
        Bitmap bm = null;

        if (mUrls[position] != null){
            bm = BitmapFactory.decodeFile(mUrls[position].toString(),options); 
            if (bm != null){
                //here could use a bitmap rotation code
                //....
                i.setImageBitmap(bm);
            }
        }else{
            bm = BitmapFactory.decodeResource(getResources(), R.drawable.deleted);
            i.setImageBitmap(bm);
        }
        i.setScaleType(ImageView.ScaleType.FIT_XY);   
        i.setLayoutParams(new Gallery.LayoutParams(200, 130)); 
        i.setBackgroundResource(mGalleryItemBackground);
        return i;   
    }

编辑

经过一些测试,我正在使用下面的代码来旋转图像,虽然速度不是很快,但目前可以。

int w = bm.getWidth();
int h = bm.getHeight();
if (w < h){
  Matrix matrix = new Matrix(); 
  matrix.postRotate(-90);
  bm = Bitmap.createBitmap(bm, 0, 0, w, h, matrix, false);    
}
i.setImageBitmap(bm);

【问题讨论】:

    标签: android gallery


    【解决方案1】:

    进入矩阵!!!

    Resize and Rotate Image - Example

    对我很有用,希望对你有帮助

      if (bm != null){
            Matrix matrix = new Matrix();
            matrix.postScale(scaleWidth, scaleHeight);
            matrix.postRotate(45);
            Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true);   
            BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);
            i.setImageBitmap(bmd); 
           }
    

    回收工作,我建议使用 asynctask 加载图像以避免 UI 阻塞。

    这是一个例子::

    http://android-apps-blog.blogspot.com/2011/04/how-to-use-asynctask-to-load-images-on.html

    另一个例子::

    http://open-pim.com/tmp/LazyList.zip

    【讨论】:

    • 您是建议创建一个新位图还是将其绘制在从预定义位图派生的画布上?我知道该怎么做,但是因为 getView 在每个滚动的项目上都会被调用,我想知道在这种情况下回收是否会起作用,并且所有这些都可能减慢并破坏画廊滚动的流畅性和速度,这实际上是它非常重要的功能.
    • 谢谢,看来使用矩阵和 createBitmap 是我目前能想到的最短方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多