我有4个相对布局:(,你可以在动画中看到)
每个RelativeView都在它之前的相对视图“下方”。
按照设计,当两个内部视图关闭时,按钮应该在绿色上方一半,在文本上方一半底部(就像动画节目一样) )
好的,所以我添加了一个在“底部textview”
中找到的按钮但是为了让底部只在视图上方的半个底部,我添加了一个负边距:
所以here it is 没有负边距:
和here it is带有负边距(所需结果)
所以,当我点击按钮时,我只是隐藏/显示(带有android:animateLayoutChanges="true"
的动画)内部2中间视图
那么问题在哪里?
问题
我不知道为什么,但只有按钮的下半部分是可点击的!我想这是因为那一半在容器视图中,而上半部分不在它的视图中......(也许我错了)
但如果我删除了负边距并且按钮完全位于其容器中 - 则该按钮100%完全可以设置(上半部分和下半部分)
正如你在动画中看到的那样(最后一帧) - 当我点击上半部分时 - 没有任何反应......
我该如何解决?
也许我采取了错误的初始方法?
nb:some more visualization of structure:
答案 0 :(得分:3)
让你的按钮成为RelativeLayouts的兄弟,而不是孩子。这可以按照您的意愿使用。
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true">![enter image description here][1]
<RelativeLayout
android:id="@+id/red"
android:background="@android:color/holo_red_dark"
android:layout_width="match_parent"
android:layout_height="100dp">
</RelativeLayout>
<RelativeLayout
android:id="@+id/green"
android:layout_below="@id/red"
android:background="@android:color/holo_green_dark"
android:layout_width="match_parent"
android:layout_height="100dp">
</RelativeLayout>
<RelativeLayout
android:id="@+id/blue"
android:background="@android:color/holo_blue_dark"
android:layout_below="@id/green"
android:layout_width="match_parent"
android:layout_height="100dp">
</RelativeLayout>
<Button
android:id="@+id/button"
android:layout_centerHorizontal="true"
android:layout_below="@id/green"
android:layout_width="wrap_content"
android:text="Hide Green"
android:layout_marginTop="-24dp"
android:layout_height="wrap_content"/>
</RelativeLayout>
看起来像这样,按钮向上/向下移动,因为setVisibility在GONE / VISIBLE之间切换为绿色RelativeLayout
答案 1 :(得分:1)
您的按钮属于底部RL。当android路由ACTION_DOWN时,它会检查布局的边框,并向其中包含事件坐标的viewgrops(VG)提供事件。然后VG根据它的坐标为它的孩子提供活动。
所以,当你点击按钮触摸事件的上半部分给予灰色RL和按钮时,蓝色RL并没有得到它。实际上给予Window的事件 - &gt; Root ViewGroup - &gt;其他一些ViewGroup - &gt;视图。并且路由基于坐标发生。对于开始触摸的ACTION_DOWN确实如此,但并非所有MotionEvent都以这种方式处理。
作为解决方案,您可以将按钮移动到另一个可以正确路由触摸事件的组视图。或者也许尝试使用触摸代表。