带有Overlay和ListView的Android(Scaled)ImageView

时间:2014-10-20 23:17:46

标签: android imageview overlay scaling

我正在尝试在代表视频的图像上放置一个“播放”按钮。我希望Android直接支持这种叠加或字形技术,但我找不到任何方法来做到这一点。

(注意这些图像使用位图按各种大小缩放)。

我尝试了几种方法,包括使用LayerDrawable(一个用于图像,一个用于叠加),使用FrameLayout并将前景设置为叠加层,最后,在图像缩放后扩展ImageView并绘制叠加层呈现。

我发现前两种方法,叠加本身与图像一起被缩放是不可接受的。我只想将叠加层放在缩放的图像中心上。

这是我在ImageView扩展中使用的代码:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (overlayBitmap == null) {
        return;
    }

    if (getDrawable() == null) {
        return; 
    }

    if (getDrawable().getIntrinsicWidth() == 0 
            || getDrawable().getIntrinsicHeight() == 0) {
        return; 
    }

    int w = getMeasuredWidth();
    int h = getMeasuredHeight();

    // Determine the post-scaled size of the overlay
    r.set(0, 0, overlayBitmap.getWidth(), overlayBitmap.getHeight());
    matrix.mapRect(r);
    // Move the overlay to the center
    matrix.postTranslate(w / 2 - r.width() / 2, h / 2 - r.height() / 2);

    // Draw the overlay
    canvas.drawBitmap(overlayBitmap, matrix, paint);

}

这似乎在所有情况下都很有效,但只有一个。这些图像在ListView中开始。选择后,它们会移动到显示区域,并且“播放”按钮在那里并且稳定。但是,在ListView中,图像是不稳定的。有时候叠加层是有的,有时候不是。有时叠加层位于中心,有时则不是。总而言之,叠加大多是缺失或错误的。

它看起来好像这是某种(矩形)失效问题(只是一个疯狂的猜测)。也就是说,当滚动重新绘制时,不会调用ImageView子类onDraw(绘制叠加层)。

当然,当然这也可能是我程序中的一个错误,但操作ImageVew子类并设置叠加层的代码包含得非常好。

有什么想法吗?

编辑我刚发现ViewOverlay看起来很有希望我必须支持冰淇淋三明治(或最低限度的果冻豆1),这个API需要果冻豆3(4.3)我甚至不拥有Jelly Bean 3兼容平板电脑。

2 个答案:

答案 0 :(得分:0)

我建议更换

    int w = getMeasuredWidth();
    int h = getMeasuredHeight(); 

使用:

     int x = canvas.getWidth();
     int y = canvas.getHeight();

因为getMeasuredWidth()和getMeasuredHeight()结果被屏蔽并执行如下操作:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
     ....
     ....
        Bitmap play = BitmapFactory.decodeResource(getResources(),
            R.drawable.play);
     int width = play.getWidth();
     int height = play.getHeight();
     int x = canvas.getWidth()/2 - width/2;
     int y = canvas.getHeight()/2 - height/2;
    canvas.drawBitmap(play, x, y, new Paint());
    }

无论我缩放图像多少,播放按钮都会保持在图像顶部的中心位置

答案 1 :(得分:0)

为什么不使用带有两个孩子的framelayout ..首先是带有缩放图像的图像视图,换行/换行。第二个是文本视图或视图,其背景设置为叠加图像,匹配/匹配布局参数