【问题标题】:ImageView is re-sizing while draw border shape on itImageView 正在重新调整大小,同时在其上绘制边框形状
【发布时间】:2013-12-23 17:52:42
【问题描述】:

这是我放在可绘制文件夹中的 shape_two 文件。

<shape xmlns:android="http://schemas.android.com/apk/res/android" >

<solid android:color="#00FFFFFF" />

<stroke
    android:width="3dp"
    android:color="#00ff00" />

</shape>

这是我绘制形状的代码

private void drawLayer(ImageView tempView, Drawable drble, int wherecall) {

    Drawable drawableRes = getResources()
            .getDrawable(R.drawable.shape_two);// loadDrawable(R.drawable.shape_two);
            int h = tempView.getMeasuredHeight();
    int w = tempView.getMeasuredWidth();
    drawableRes.setBounds(0, 0, w, h);
    Drawable[] drawableLayers = { drble, drawableRes };
    ld = new LayerDrawable(drawableLayers);
    if (wherecall != 3) {
        tempView.setBackground(ld);
    } else {
        tempView.setImageDrawable(ld);
    }
    td = new TransitionDrawable(drawableLayers);
    td.setCrossFadeEnabled(true);

}

这里 tempview 是我的 ImageView,而 drble 是我在另一层上使用的另一个可绘制对象。此代码没有任何错误消息正常工作。

我的问题是当我在 ImageViews 上绘制形状时,它会重新调整大小(更改高度和宽度)。我有不同大小的 imageView,我想使用单一形状的 xml 来绘制边框,这样做时我的 ImageView 大小不应该改变。谁能告诉我如何实现它。

在搜索了很多东西后,我才知道我无法对其执行位图操作以根据形状重新调整大小,因为 xml 文件不是位图。我在某处读到,这个问题可以通过使用画布来解决,但是怎么做..

更新:

我观察到,虽然改变图层 onsingletap 只是高度增加而不是 ImageView 的宽度。如果我的布局有 4 个 ImageView,那么第一次只在不同的 imageView 上单击,所有 imageView 都会重新调整大小一次。之后,如果我们再次单击 - 再次没有任何东西可以重新调整大小。 我想在 ImageView 上设置图层第一次重新调整视图大小,然后它会自行调整。我不知道为什么会这样。

我正在为我的所有布局应用相同的代码,对于某些布局,它可以正常工作,而对于某些布局则不行。

我已经尝试过了。

  1. 我已经尝试通过 GradientDrawable 制作边框图像

     GradientDrawable gd = new GradientDrawable();
         gd.setStroke(3, Color.GREEN);
         gd.setSize(drble.getBounds().width(), drble.getBounds().height());
         gd.setColor(0xff424242);
    
  2. 我的另一个尝试是在画布上绘制图像,

  3. 将边框图片放入drawable文件夹根据ImageView的高度和宽度重新调整大小,将其转换为drawable并设置。
  4. 我还尝试减小内部图像大小,并且边框位图大小是图像视图的大小,也与之相反。

每件事都给我同样的结果。

更新

请仔细阅读我的回答,您可能会发现搜索并获得+50的好点。

【问题讨论】:

    标签: android imageview android-canvas layer shape


    【解决方案1】:

    经过一番挣扎,用了这么多方法,花了一天一夜的时间寻找,我终于在这三行中找到了我的解决方案。

        ld.setBounds(0, 0, tempView.getWidth(), tempView.getHeight());
        ld.setLayerInset(0, 0, 1, 0, 1);
        ld.setLayerInset(1, 0, 0, 0, 0);
    

    如果您仍然有重新调整 imageView 大小的问题,请在您的 shape xml 布局中添加一些填充。这可能会节省一些人的时间。

    【讨论】:

      【解决方案2】:

      为什么要使用该函数来绘制边框?你试过直接在布局中赋值吗?

      <ImageView 
       android:background="@drawable/shape_two"
      ...
      />
      

      更新

      如果需要动态添加或移除边框,可以使用

      tempView.setBackgroundDrawable(R.drawable.shape_two);//to add it
      tempView.setBackgroundDrawable(null);//to remove it
      

      【讨论】:

      • 我的形状是封闭的。否则会抛出错误。这不是问题。而且我无法在 imageView 的 xml 中设置形状,因为我需要在运行时绘制并删除它。边框仅用于图像选择。如果用户选择另一个图像视图,则边框视图将从第一个视图中删除并将其设置在另一个视图上。
      • 我更新了答案。如果您需要在运行时更改它,我想添加和删除背景就可以了。请尝试一下,让我知道会发生什么。
      • 我也不能使用这个。看我有两个图像。如果我在 imageview 上显示边框,我的另一个图像也在那里,必须始终查看。只有边框会显示和隐藏。如果在后台设置为 null,我的两个图像都将被删除。
      • 我不确定我是否理解您所说的,尤其是您的图片已被删除。无论如何,我想我缺乏很多代码来能够很好地欣赏。也许你应该发布更多代码来向我们展示你的图像在 xml 中的表现如何,以及你正在执行哪些其他操作来组成它将如何显示
      • 查看照片爱好者应用程序,您将了解他们如何在图像选择上绘制边框。
      【解决方案3】:

      请看一下这个解决方案link

      您需要添加一个框架布局并在其上创建一个ImageView,并在框架布局上进行边框操作。

      还要为您的图像视图保留一些边距,以便背景框架布局可见。

      【讨论】:

      • 在 imageView 上使用边距填充,这将减小视图内图像的大小,不会干扰父视图
      • 我已经看过这个链接了。我无法为我的每个 ImageView 单独制作 FrameLayout。
      • 好的,在完成所有更改后尝试重新设置您的视图,调用 myImageView.invalidate();这将重新加载您的视图。也试试 myImageView.setLayer(0,0,1,0,1);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多