【问题标题】:Android: How to make one element come in front of others inside a linearlayout?Android:如何让一个元素在线性布局中出现在其他元素的前面?
【发布时间】:2014-05-28 15:48:44
【问题描述】:

所以我的问题实际上与动画有关。我想在这个线性(水平)布局中为红色方块设置动画:http://image.noelshack.com/fichiers/2014/22/1401291148-stck.jpeg

我想使用放大红色方块的动画,所以我想得到这个: http://image.noelshack.com/fichiers/2014/22/1401291147-stck2.jpeg (红色方块越过左右灰色方块。我不在乎它被线性布局的高度裁剪,我知道如何处理)

现在,如果我启动动画,它会越过左侧的灰色方块,但在右侧的下方...我希望红色的方块位于其他两个上方。

无论如何我可以做到这一点吗?我尝试了 myImageView.BringToFront() 但它破坏了线性布局,将红色方块带到了最右边。

注意:它必须是线性布局,我知道如何使用相对布局来做到这一点,但我还有其他限制,使我需要线性布局...

PS:如果这根本不可能,我是否可以在相对布局中实现线性布局中的“权重”? (我希望我的 4 个方格均匀放大,以便它们填充用户屏幕的宽度。我可以在线性布局中实现这一点,但它让我回到了我的第一个问题......)

【问题讨论】:

  • 您应该更改 z 顺序。还要检查这个 developer.android.com/reference/android/view/View.html#bringToFront 如果你不使用 Canvas,这当然是。
  • z 顺序是绘制它们的顺序。在线性布局中,先绘制第一个元素,然后绘制第二个,以此类推;这就是为什么第三个元素被绘制在第四个元素之下的原因。线性布局这样做是因为它计算第一个项目的大小,然后是第二个,依此类推;因此,bringToFront 正在改变这个顺序,这就是为什么它会影响你的布局。您使用什么类型的动画和动画类?你确定你不能使用RelativeLayout或者FrameLayout吗?是您需要的布局权重吗,因为对于 4 个子视图,有很多方法可以解决这个问题。
  • @Chris:感谢您对 z 顺序的解释。关于动画,我还不知道。例如:RotateAnimation anim = new RotateAnimation(0f, 350f,125f, 125f); anim.setInterpolator(new LinearInterpolator()); anim.setDuration(1400); 我需要的是权重和动画,以便在所有内容之上/之前/之上播放。如果你能告诉我如何在相对布局中使用权重来解决我的问题。 (它增加了一些工作,但应该没问题)
  • 我不能顺便重绘特定的 imageView 吗?如果我不重绘整个布局,它应该做对吗?哦,如果有助于找到实现相对布局权重的最佳解决方案,我的项目中有 16 个子视图。

标签: android android-layout android-animation


【解决方案1】:

我认为最简单的做法是为您的子视图使用的任何内容创建您自己的子视图,我猜您使用的是ImageView。然后为布局权重添加 getter 和 setter 方法。像这样的:

public float getLayoutWeight()
{
    ViewGroup.LayoutParams layoutParams = getLayoutParams();
    if (layoutParams instanceof LinearLayout.LayoutParams)
    {
        return ((LinearLayout.LayoutParams)layoutParams).weight;
    }

    return -1;
}

public void setLayoutWeight(float weight)
{
    ViewGroup.LayoutParams layoutParams = getLayoutParams();
    if (layoutParams instanceof LinearLayout.LayoutParams)
    {
        ((LinearLayout.LayoutParams)layoutParams).weight = weight;
        requestLayout();
        invalidate();
    }
}

然后使用ObjectAnimator 为权重设置动画。请参阅示例here。你会做这样的事情:

ObjectAnimator anim = ObjectAnimator.ofFloat(redSquareView, "layoutWeight", 1f, 2f);
anim.setDuration(1000);
anim.start();

注意:我不确定这是否会起作用,我还没有测试过;但根据您所说,它的代码量最少。此外,此类仅适用于 API 11 及更高版本。

【讨论】:

  • 这听起来很复杂。我对android还很陌生,不理解这个答案的一半。我真的在寻找一条我错过的简单线路。我想我不能同时拥有线性和相对布局的优势......无论如何,谢谢您的时间,如果我能理解这一切,我可能会尝试这个。我会等几天,然后将您的答案标记为已接受,看看是否有人有其他解决方案。我对此表示怀疑。
  • 抱歉有任何混淆。我的意思是创建您用于正方形的视图的子类。因此,如果您使用ImageView 使MrGoodKillsImageView 与所有3 个构造函数一起使用(在每个构造函数中调用相应的super(args...)。然后实现我给您的2 个方法。ObjectAnimator 类使用传入的任何字符串变量作为第二个参数,并调用 getter 和 setter 方法(转换为驼峰式)以“动画”该属性。
  • 我并不是说你的解释不清楚,我的意思是我在 android 和 java 方面真的很新,是什么让我很难。但据我了解,您认为我需要为权重设置动画。我其实没有。我正在尝试创建一个 2048 之类的。所以,我想要的是我的灰色方块网格延伸到屏幕的边缘。 (我希望它尽可能宽,该应用程序仅处于纵向模式)我可以使用线性布局来做到这一点。但后来我想为我的灰色方块设置动画,我遇到了上面描述的问题......
  • 现在,我想我设法从这个问题创建了一个子视图:stackoverflow.com/questions/1470867/creating-custom-imageview。我想我必须修改 onDraw 函数,但我真的不知道该放什么。 (如前所述,我以为会有一个简单的行添加,我不希望你向我解释java是如何工作的^^。无论如何,仍然感谢帮助:))
猜你喜欢
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 2022-12-05
  • 2020-12-25
相关资源
最近更新 更多