我有2个LinearLayout的布局。第一个用作包含图形的容器,第二个包含几个按钮。
当应用启动时,首次包含图表的LinearLayout1将被隐藏View.GONE
。
然后当我触摸LinearLayout2的按钮时,此布局会使用翻译动画返回原始位置。
最后,我应该能够再次隐藏LinearLayout1。我想通过向上拉动LinearLayout2来实现这一点,所以当用户向上移动一点LinearLayout2时,LinearLayouy1将再次被View.GONE
隐藏。
最后一部分是我需要一些帮助的部分。我用OnTochListener()
尝试了一些东西,但是我没有用太多的东西,我不知道怎么做。这是我执行此操作的代码snnipet:
/*Layout views*/
private View graphContainer; //This is the LinearLayout1
private View valuesContainer; //This is the LinearLayout2
private float oldY;
private float newY;
...
valuesContainer.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float y = event.getY();
oldY = y;
break;
case MotionEvent.ACTION_MOVE:
float y2 = event.getRawY();
newY = y2;
if (oldY < newY) {
graphContainer.setVisibility(View.GONE);
}
break;
}
return true;
}
});
根据我触摸的位置进行移动,我可以将可见性设置为GONE,但移动不是我想要的,我不会移动LinearLayout2。
答案 0 :(得分:1)
当用户移动手指时,你上面所做的就是隐藏layout2。
你说那是&#34;你不能移动LinearLayout2&#34; - &GT;为了移动视图,您需要更新它的LayoutParams。您可以在此处查看示例:How to move a view in Android?
这样你就可以推动&#34; layout2 up和某些时候隐藏layout1(使用动画或推送layout1)。希望这会有所帮助。
修改(请求的代码示例):
当视图的参数需要改变时,BTW - animations transitions是更好的方法。这不是你问题的答案,因为你想要一个真实的&#34;拖动&#34;感觉(上升时)。 另外 - android L has some beautiful animations(我还没有使用过)我们应该留意。所以...使用如下布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MyActivity">
<LinearLayout
android:id="@+id/first_layout"
android:background="@android:color/darker_gray"
android:layout_width="match_parent"
android:layout_height="100dp" >
</LinearLayout>
<LinearLayout
android:id="@+id/second_layout"
android:background="@android:color/holo_green_dark"
android:layout_width="match_parent"
android:layout_height="100dp" >
</LinearLayout>
</LinearLayout>
以及相应的活动如下:
public class MyActivity extends Activity {
int yDown = 0;
int initialTopMargin = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
LinearLayout layout2 = (LinearLayout)findViewById(R.id.second_layout);
layout2.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event)
{
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
switch (event.getAction())
{
case MotionEvent.ACTION_MOVE:
params.topMargin = initialTopMargin - (yDown - (int)event.getRawY());
view.setLayoutParams(params);
break;
case MotionEvent.ACTION_DOWN:
yDown = (int)event.getRawY();
initialTopMargin = params.topMargin;
break;
}
return true;
}
});
}
}
答案 1 :(得分:0)
如何使用onDragListener?
valuesContainer.setOnDragListener(new OnDragListener() {
@Override
public boolean onDrag(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float y = event.getY();
oldY = y;
break;
case MotionEvent.ACTION_MOVE:
float y2 = event.getRawY();
newY = y2;
if (oldY < newY) {
graphContainer.setVisibility(View.GONE);
}
break;
}
return true;
}
});