【问题标题】:Android, How to add a bitmap layer over another bitmap layer, dynamically from list?Android,如何从列表中动态地在另一个位图图层上添加位图图层?
【发布时间】:2012-06-14 09:13:17
【问题描述】:

在我的应用程序中,我有一个列表适配器。每行在左侧包括一个 imageView,在右侧包括两个 textView。为了获取图像,我使用Universal-Image-Loader 库。

我的 getView() 方法是这样的:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;        

        if (convertView == null) {
            convertView     = myInflater.inflate(R.layout.list_news_adapter, null);
            holder          = new ViewHolder();
            holder.ivIcon   = (ImageView) convertView.findViewById(R.id.list_news_icon);
            holder.tvTitle  = (TextView)  convertView.findViewById(R.id.list_news_title);
            holder.tvDate   = (TextView)  convertView.findViewById(R.id.list_news_date);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }


        holder.tvTitle.setText(video.getTitle().get(position));
        holder.tvDate.setText(localTime.get(position));

        // Load and display image
        String imageUrl = (video.getDefaultImage128x96().get(position));
        imageUrl = imageUrl.trim().replaceAll(" ", "%20");
        imageLoader.displayImage(imageUrl, holder.ivIcon, options);



        holder.ivIcon.buildDrawingCache();
        Bitmap image = holder.ivIcon.getDrawingCache();
        if(image != null) {
            image = putOverlay(image, holder.ivIcon.getWidth(), holder.ivIcon.getHeight());
            holder.ivIcon.setImageBitmap(image);
            holder.ivIcon.destroyDrawingCache();
        }


        return convertView;
    }

在下面的代码中,我给出了要在不同线程中下载的库的 URL 列表。

// Load and display image
String imageUrl = (video.getDefaultImage128x96().get(position));
imageUrl = imageUrl.trim().replaceAll(" ", "%20");
imageLoader.displayImage(imageUrl, holder.ivIcon, options);

在下面的代码之后,我得到了 imageView 的当前图像(已下载)并要求其他方法在该图像之上添加一个图层。

holder.ivIcon.buildDrawingCache();
Bitmap image = holder.ivIcon.getDrawingCache();

if(image != null) {
        image = putOverlay(image, holder.ivIcon.getWidth(), holder.ivIcon.getHeight());
        holder.ivIcon.setImageBitmap(image);
        holder.ivIcon.destroyDrawingCache();
}

putOverlay() 方法是这样的:

public Bitmap putOverlay(Bitmap bmp, int width, int height) {
        Bitmap overLay = BitmapFactory.decodeResource(context.getResources(), R.drawable.video_overlay);

        Bitmap bmBackground = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
        Canvas canvas = new Canvas(bmBackground);
        Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
        canvas.drawBitmap(bmp, 0, 0, paint); 
        canvas.drawBitmap(overLay, width*3/8, height*3/8, paint);

        return bmBackground;
    }

这是功能部分。结果呢! 只要主图像正在下载,通用图像加载器库就会使用预定义的图像。我的代码可以合并这两层。

但是,当下载主图像时,它会覆盖以前的图像,而我希望我的叠加图像位于该图像之上。

但是,滚动屏幕后,我可以看到我添加的图像(大多数图像有,其中一些没有我添加的图像)。

任何建议/cmets 将不胜感激。

【问题讨论】:

    标签: android listview bitmap overlay bit-manipulation


    【解决方案1】:

    解决方案比我想的要容易。

    首先我删除了那些

    holder.ivIcon.buildDrawingCache();
    Bitmap image = holder.ivIcon.getDrawingCache();
    if(image != null) {
        image = putOverlay(image, holder.ivIcon.getWidth(), holder.ivIcon.getHeight());
        holder.ivIcon.setImageBitmap(image);
        holder.ivIcon.destroyDrawingCache();
    }
    

    putOverlay() 来自我的列表适配器的方法,然后在行的XML 文件(list_news_adapter)中,我添加了另一个imageView 并使用我的图像设置其源属性。

    哇,效果很好。

    【讨论】:

      猜你喜欢
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      相关资源
      最近更新 更多