【问题标题】:Drawable in View getting squashed视图中的可绘制对象被压扁
【发布时间】:2013-02-23 16:55:29
【问题描述】:

问题和疑问:

我目前有一个视图寻呼机,里面只有 2 个页面/视图,它们水平相邻。

我的视图是自定义视图,它在其顶部以低不透明度/alpha 值绘制双色渐变和图像。

我发现当我在屏幕上滑动以从第一个视图/页面移动到第二个视图/页面或反之亦然时,图像被压扁了。 我怎样才能阻止这种情况发生,并正常绘制它们?

示例:

左侧图像显示了第一个可见视图,预滑动右侧图像显示了两个视图,在滑动过程中

代码:

我有一个我之前设置的Drawable 变量overlayImage,除了设置不透明度之外我没有做任何事情。

@Override
protected void onDraw(Canvas canvas) {
    p.setShader(new LinearGradient(0, 0, 0, getHeight(), startColor, endColor, Shader.TileMode.MIRROR));
    canvas.drawPaint(p);

    //Pretty sure the mistake is around these two next lines
    overlayImage.setBounds(canvas.getClipBounds());
    overlayImage.draw(canvas);
}

【问题讨论】:

  • 你的overlayImage是什么样的Drawable?这个 onDraw 是您自定义视图的一部分吗?
  • "overlayImage" 实际上只是一个普通的、普通的 Drawable;是的,这个 onDraw 是我的自定义视图的一部分。

标签: java android android-viewpager drawable android-view


【解决方案1】:

我实际上认为它在你的

overlayImage.setBounds(canvas.getClipBounds());

代码行。当您获取最左侧(在最右侧滑动)视图的剪辑边界时,它正在获取可视区域的大小(即较小的收缩区域),因此图像被绘制到该收缩空间中。

您可能希望通过它所覆盖的视图的整体大小来设置边界,而不是剪裁的边界。改用画布的 getHeight() 和 getWidth() 并建立自己的边界。

我实际上认为你真的应该在你的设置代码中只设置一次 overlayImage 边界。绘制代码根本不需要设置它,然后当视图开始离开屏幕时,overlayImage 的绘制将自然地与绘图画布的其余部分一起移动。

【讨论】:

    【解决方案2】:

    我认为您需要在drawable-hdpi 文件夹中创建一个xml。 其中将包含您的shader/linear gradiant..(选项请查看here

    <?xml version="1.0" encoding="utf-8"?>
    
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <gradient
            android:startColor="#474946"
            android:endColor="#181818"
            android:angle="270"/>
    </shape>
    

    然后您可以将xml 设置为背景......这应该可以解决我认为的问题。

    (如果不使用android:shape="rectangle" 不起作用,可能会有所帮助)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2011-05-14
      相关资源
      最近更新 更多