【问题标题】:GridView scrolling stutteringGridView滚动卡顿
【发布时间】:2015-11-17 22:26:02
【问题描述】:

我认为我的图像适配器有问题.. 当我通过 gridview 滚动时,它会严重结巴。我想我忽略了代码中的某些内容,但我无法弄清楚。

我的图像适配器代码:

public class ImageAdapter extends BaseAdapter
{
    private Context context;

    public ImageAdapter(Context c)
    {
        context = c;
    }

    //---returns the number of images---
    public int getCount() {
        return logoCount;
    }

    //---returns the ID of an item---
    public Object getItem(int position) {
        return position;
    }

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

    //---returns an ImageView view---
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ImageView imageView;
        if (convertView == null) {
            imageView = new ImageView(context);
            imageView.setLayoutParams(new GridView.LayoutParams(300, 300));
            imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            imageView.setPadding(5, 5, 5, 5);
        } else {
            imageView = (ImageView) convertView;
        }
        Drawable drawable = null;
        switch(GetLogoStatus(position)) {
            case 1:
                drawable = ContextCompat.getDrawable(context, R.drawable.check);
                break;
            case 2:
                drawable = ContextCompat.getDrawable(context, R.drawable.tipsused);
                break;
            case 3:
                drawable = ContextCompat.getDrawable(context, R.drawable.cross);
                break;
        }
        final Bitmap largeImage = ((BitmapDrawable) drawable).getBitmap().copy(Bitmap.Config.ARGB_8888, true);

        final Drawable logoDrawable = ContextCompat.getDrawable(context, GetImage(position));
        Bitmap smallImage = ((BitmapDrawable) logoDrawable).getBitmap().copy(Bitmap.Config.ARGB_8888, true);

        final Canvas canvas = new Canvas(largeImage);

        float ratioBitmap = (float) smallImage.getWidth() / (float) smallImage.getHeight();
        float ratioMax = (float) largeImage.getWidth() / (float) largeImage.getHeight();
        int finalWidth = largeImage.getWidth();
        int finalHeight = largeImage.getHeight();
        if (ratioMax > 1) {
            finalWidth = (int) ((float)largeImage.getHeight() * ratioBitmap);
        } else {
            finalHeight = (int) ((float)largeImage.getWidth() / ratioBitmap);
        }
        smallImage = Bitmap.createScaledBitmap(smallImage, finalWidth, finalHeight, true);

        int startX= (canvas.getWidth()-smallImage.getWidth())/2;
        int startY=(canvas.getHeight()-smallImage.getHeight())/2;
        canvas.drawBitmap(smallImage,startX, startY, null);
        imageView.setImageBitmap(largeImage);

        //imageView.setImageResource(GetImage(position));
        return imageView;
    }
}

希望有人能帮帮我:)

【问题讨论】:

  • 看起来你在主线程上做了很多缩放等等,这很可能会有所贡献。你可以将工作转移到另一个线程上(注意同时引用仍然存在),或者你可以给毕加索图书馆一个镜头,它可以为你处理很多事情。
  • 除此之外,使用 Traceview 等工具来确定您将时间花在哪里。我的猜测是,由于垃圾收集过多,您正在死去,因为您每行都会产生大量垃圾。与其创建一堆位图,不如创建您自己的 View 子类来进行缩放和渲染。
  • @ReinS 我应该将代码的哪些部分放入线程以获得更好的性能?
  • @CommonsWare 子类是什么意思?
  • 跟我说的差不多。您可以创建自己的View 的自定义子类,覆盖onDraw() 等方法,并将图像直接渲染到Canvas,而不是创建一堆位图。

标签: android image gridview bitmap


【解决方案1】:
  • 使用 自定义视图 而不是每次都尝试使用 getView
  • 使用 ViewHolder

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2018-05-30
    • 2013-05-03
    相关资源
    最近更新 更多