我的应用程序遇到了关于两个重叠布局的平滑度的问题。我建立了某种幻灯片菜单(如Facebook或YouTube)。此菜单包含两个布局:显示数据的主要布局,并包含其下方的菜单布局。然后是菜单布局本身,一个带有自定义行布局的普通ListView。
主:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<include
android:id="@+id/menu_list"
layout="@layout/menu_list"/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/news_content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
android:orientation="vertical">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ProgressBar
android:id="@+id/NewsProgressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"
style="@android:style/Widget.Holo.Light.ProgressBar.Large"/>
</LinearLayout>
</RelativeLayout>
菜单:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="250dip"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/ic_sidebar_bg">
<RelativeLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content">
<ImageView
android:alpha="0.8"
android:layout_height="40dp"
android:layout_width="match_parent"
android:background="#222222"/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginLeft="10dip"
android:layout_marginTop="12dip"
android:textSize="14dp"
android:textColor="#666"
android:text="@string/menu_cat_main"/>
<ImageView
android:layout_height="1dp"
android:layout_marginTop="40dp"
android:layout_width="match_parent"
android:background="#666666"/>
</RelativeLayout>
<ListView
android:id="@+id/mainMenuList"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
我已经认识到这种重叠导致ListViews可怕地滞后。我所做的就是让菜单包含“visibility:gone”,这会使ListViews工作得非常好。但是,如果我尝试将内容向侧面滑动,则包含(菜单)会再次显示,而幻灯片则是除了平滑之外的所有内容。但除了这个宇宙问题,菜单的工作方式与YouTube上的菜单完全相同。
要明确以下代码: viewContent(View)包含LinearLayout及其内容 viewMenu(View)包含菜单布局包含 每当菜单可以通过触摸滑动时都可以滑动(bool)(触摸屏幕的某个区域为真) 每当菜单被滑出时,isMenuScrolled(bool)
这里是触摸事件的代码:
public boolean dispatchTouchEvent(MotionEvent touchevent) {
switch (touchevent.getAction()) {
case MotionEvent.ACTION_MOVE:
if (canSlide) {
if (touchevent.getX() < viewMenu.getWidth()) {
viewContent.setX(touchevent.getX());
} else if (touchevent.getX() < 0) {
viewContent.setX(0);
} else if (touchevent.getX() > viewMenu.getWidth()) {
viewContent.setX(viewMenu.getWidth());
}
viewContent.setEnabled(false);
}
return true;
case MotionEvent.ACTION_DOWN:
if (touchevent.getY() > 200 && touchevent.getX() < 50 && !isMenuScrolled) {
viewMenu.setVisibility(View.VISIBLE);
touchStart = touchevent.getX();
canSlide = true;
} else if (touchevent.getY() > 200 && touchevent.getX() > viewMenu.getWidth() && isMenuScrolled) {
viewMenu.setVisibility(View.VISIBLE);
touchStart = touchevent.getX();
canSlide = true;
} else {
canSlide = false;
}
return true;
case MotionEvent.ACTION_UP:
if (viewContent.getX() != 0 || viewContent.getX() != viewMenu.getWidth()) {
if (viewContent.getX() < touchStart) {
ObjectAnimator transAnimation = ObjectAnimator.ofFloat(viewContent, "x", viewContent.getX(), 0);
transAnimation.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
viewContent.setEnabled(false);
isMenuScrolled = false;
}
@Override
public void onAnimationEnd(Animator animation) {
viewMenu.setVisibility(View.GONE);
viewContent.setEnabled(true);
}
@Override
public void onAnimationCancel(Animator animator) {
// nothing
}
@Override
public void onAnimationRepeat(Animator animator) {
// nothing
}
});
transAnimation.setDuration(300);
transAnimation.start();
} else if (viewContent.getX() > touchStart) {
ObjectAnimator transAnimation = ObjectAnimator.ofFloat(viewContent, "x", viewContent.getX(), viewMenu.getWidth());
transAnimation.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
viewContent.setEnabled(false);
isMenuScrolled = true;
}
@Override
public void onAnimationEnd(Animator animation) {
viewContent.setEnabled(true);
}
@Override
public void onAnimationCancel(Animator animator) {
// nothing
}
@Override
public void onAnimationRepeat(Animator animator) {
// nothing
}
});
transAnimation.setDuration(300);
transAnimation.start();
}
}
return true;
}
return true;
}
如何解决此问题,使其滚动更平滑? 最后一件事,滚动菜单时禁用内容的最佳方法是什么? viewContent.setEnabled无法正常工作。
非常感谢提前!
答案 0 :(得分:0)
<强>尝试:强>
在清单的应用标记下添加android:hardwareAccelerated="true"
。
并强> myViewContainer.setLayerType(View.LAYER_TYPE_HARDWARE, null);