azp*_*lic 2 android android-listview android-viewpager
我有一个ViewPager,其中的页面包含ListViews.一切正常,我的viewPAger和ListViews按预期工作:可以在页面之间滑动,列表视图可以按原样垂直滚动.
现在我想添加一个PageTransformer来平滑分页anbd我使用了谷歌文档中提供的ZoomOutPageTransformer.
现在我在视图之间滑动时有一个很好的动画但是列表不再可滚动了.
这是代码:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
LayoutInflater inflater = LayoutInflater.from(getActivity());
viewPager = (ViewPager) view.findViewById(R.id.bookMenuPager);
viewPager.setPageTransformer(false, new ZoomOutPageTransformer());
pagerAdapter = new MenuPagerAdapter();
viewPager.setAdapter(pagerAdapter);
}
class MenuPagerAdapter extends PagerAdapter{
@Override
public int getCount() {
return 3; //change this as needed
}
@Override
public boolean isViewFromObject(View view, Object o) {
return view.equals( o );
}
@Override
public Object instantiateItem(ViewGroup collection, int position) {
LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(position == 0){
if(!rootMenuAdded){
viewPager.addView(rootMenucont, 0);
rootMenuAdded = true;
}
return rootMenucont;
}else if(position == 1){
if(!level1MenuAdded){
viewPager.addView(level1MenuCont, 0);
level1MenuAdded = true;
}
return level1MenuCont;
}else if(position == 2){
if(!level2MenuAdded){
viewPager.addView(level2MenuCont, 0);
level2MenuAdded = true;
}
return level2MenuCont;
}
//we got a problem houston
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
和页面的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/level1MenuCont"
android:layout_height="match_parent"
android:layout_width="match_parent"
>
<ListView
android:id="@+id/level1Menu"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#f02bb6"
>
</ListView>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
如果我的列表按预期滚动,我该怎么办?PageTransformer在我的ListView中打破了什么,以至于它不再滚动?这是一个已知的错误?
谢谢你的帮助 :)
rup*_*pps 10
我想我找到了解决这个问题的方法.
经过一些调查后,我认为这只会在你应用PageTransformer改变坐标的情况下发生,Views因此它们都是相互重叠的(两个示例变换器正是这样做的).
当你在新视图的方向上滑动Z-index LOWER比OLD VIEW(通常是向后滑动)时,那些变形金刚会发生的事情是OLD VIEW位于NEW VIEW的顶部,Alpha == 0,是后来获得"幽灵"触摸的那个.
不幸的是,@ ngatyrauks的解决方案bringToFront()对我不起作用(虽然它肯定应该).
但是,我已经调整了变压器,因此隐形views将其可见性改为"GONE".这就是诀窍.
我还没有调查这个可见性更改是否有任何副作用(一个GONE视图将返回null并在布局等零,所以也许这会破坏其他内容ViewPager),但到目前为止它的工作完美.
我在这里发布DepthPageTransformer了这些更改的调整(在文档中相同).希望它对任何人都有帮助!
package com.regaliz.gui.fx;
import android.util.Log;
import android.view.View;
import android.support.v4.view.ViewPager;
public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final String TAG="DepthTransformer";
private static float MIN_SCALE = 0.75f;
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
Log.d(TAG, "VIew "+view+" Position: "+position);
if (position <= -1) { // [-Infinity,-1) ] ***
// RLP> I Changed to include "-1" as well: When position is -1, the view is not visible
// This page is way off-screen to the left.
view.setAlpha(0);
Log.d(TAG, "VIew "+view+" Position: "+position+", way left");
view.setVisibility(View.GONE);
} else if (position <= 0) { // [ (-1,0]
// Use the default slide transition when moving to the left page
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
if (position==0) {
Log.d(TAG, "View "+view+" focused now?");
}
if (view.getVisibility()!=View.VISIBLE)
view.setVisibility(View.VISIBLE);
} else if (position <= 1) { // (0,1]
// Fade the page out.
view.setAlpha(1 - position);
// Counteract the default slide transition
// I THINK THIS IS WHAT BREAKS EVERYTHING
// ViewPager normally has the views one after another, but this makes all views on top
view.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
if (position==1) {
Log.d(TAG, "View "+view+" invisible now?");
view.setVisibility(View.GONE);
// we totally hide the view. This seems to solve focus issue
} else {
if (view.getVisibility()!=View.VISIBLE)
view.setVisibility(View.VISIBLE);
}
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
// we totally hide the view. This seems to solve focus issue
// I have to check for strange side-effects, but so far I found none :)
view.setVisibility(View.GONE);
Log.d(TAG, "VIew "+view+" Position: "+position+", way right");
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1822 次 |
| 最近记录: |