Android ListView内部视图寻呼机赢得';应用页面转换器时,请不要滚动
我有一个ViewPager,其中页面包含ListView。 一切正常,我的viewPAger和ListViews都正常工作:可以在页面之间滑动,ListViews可以垂直滚动 现在,我想添加一个PageTransformer,以平滑我在google文档中使用的分页anbd 现在我有了一个很好的动画,当在视图之间滑动时,列表不再是可滚动的 代码如下:Android ListView内部视图寻呼机赢得';应用页面转换器时,请不要滚动,android,android-listview,android-viewpager,Android,Android Listview,Android Viewpager,我有一个ViewPager,其中页面包含ListView。 一切正常,我的viewPAger和ListViews都正常工作:可以在页面之间滑动,ListViews可以垂直滚动 现在,我想添加一个PageTransformer,以平滑我在google文档中使用的分页anbd 现在我有了一个很好的动画,当在视图之间滑动时,列表不再是可滚动的 代码如下: @Override public void onViewCreated(View view, Bundle savedInstanceState)
@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;
}
}
以及页面的布局:
<?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>
我该怎么做才能让列表按预期滚动?PageTransformer在我的ListView中中断了什么,使它不再滚动?
这是已知的bug吗
谢谢您的帮助:)我不知道您是否能正常工作,但我有相同的问题,有一个PageDepthTransformer。虽然我使用的是gridview,但滚动可以工作,但是我的后续片段似乎有焦点,并且我的顶级片段没有注册正确的onClick()事件 我的解决方法是将全局布局侦听器添加到viewPager,并将当前视图放在前面
viewPager.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
View view = viewPager.getChildAt(currentFragmentPosition);
if (view != null) {
view.bringToFront();
}
}
)};
对我来说,这似乎像是黑客行为,而我还没有在轮换方面完全做到这一点。但希望它能对您有所帮助。我想我已经找到了解决这个问题的方法 经过一些调查,我认为只有当你应用一个
PageTransformer
来改变视图的坐标时,才会发生这种情况,所以视图都是相互重叠的(这两个示例变压器就是这样做的)
当您沿新视图的Z索引低于旧视图的方向滑动时(通常是向后滑动),这些变换器发生的情况是,旧视图位于新视图的顶部,Alpha==0,并且是稍后被“重影”触及的视图
不幸的是,@ngatyrauksbringToFront()
的解决方案对我不起作用(尽管它确实应该起作用)
但是,我调整了转换器,使不可见的视图将其可见性更改为“消失”。这就是诀窍
我还没有调查这个可见性更改是否有任何副作用(一个消失的视图将返回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");
}
}
}
package com.regaliz.gui.fx;
导入android.util.Log;
导入android.view.view;
导入android.support.v4.view.ViewPager;
公共类DepthPageTransformer实现ViewPager.PageTransformer{
专用静态最终字符串标记=“DepthTransformer”;
专用静态浮动最小刻度=0.75f;
公共页面(视图、浮动位置){
int pageWidth=view.getWidth();
日志d(标签“视图”+视图+”位置:“+位置);
如果(位置I也更改为包含“-1”:当位置为-1时,视图不可见
//这个页面在屏幕的左边。
视图。setAlpha(0);
日志d(标签“视图”+视图+”位置:“+位置+”,左侧);
view.setVisibility(view.GONE);
}else if(位置以下是原因的详细信息
在4.1之后,框架将自定义子绘图顺序视为发送触摸事件的隐含Z顺序。如果您的视图在此页面转换后重叠,则在较旧的平台版本上,它们可能不会以预期顺序接收触摸事件。请检查哪个视图接收触摸事件以确定
如果这是您看到的,您有几个选择:
- 在PagerAdapter中添加/删除子视图时强制执行所需的顺序
- 当页面不再完全可见时,删除PageTransformer应用的X转换,即“position”参数报告完全-1或1
这是我的解决方案
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
if (position <= -1 || position >= 1) { // [-Infinity,-1) ] ***
// [-Infinity,-1] or [1,+Infinity]
// This page is way off-screen to the left or way off-screen to the right.
view.setAlpha(0);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
} 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);
} else if (position < 1) {
// (0,1)
// Fade the page out.
view.setAlpha(1 - position);
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);
}
}
public页面(视图、浮动位置){
int pageWidth=view.getWidth();
如果(位置=1){/[-无穷大,-1)]***
//[-无限,-1]或[1,+无限]
//此页面左侧远离屏幕或右侧远离屏幕。
视图。setAlpha(0);
view.setTranslationX(0);
视图.setScaleX(1);
视图。设置刻度(1);
}否则如果(位置嗨!我想我也有同样的问题。对你的解决方案有很大的希望,因为在我的例子中,焦点似乎停留在新旧可视页面之间。我尝试了这个,也在其他地方给bringToFront打了电话,但是这个电话并不能解决问题。你有什么其他建议吗?我已经调查过,发现我只有is如果我向后滑动,sue:“触摸”焦点仍保留在刚刚离开屏幕的视图上。解决方案很有意义:该视图的z索引大于当前项目的z索引。但无论我调用bringToFront还是requestFocus……幻影触摸焦点仍保留在另一个视图上:(这是唯一一个对我有效的解决方案。谢谢。绝对没有问题相信这是可行的。我已经准备好点击一些东西了。搜索listfragment viewpager没有滚动,并且忘记了我已经添加了转换。如果示例失败了?我正在点击更多的答案。哈哈,谢谢,我也遇到了同样的情况,这是完整的。)疯狂和我不得不微调试wtf正在打开…最后我试图完全避免页面转换器,我不喜欢片段处于随机状态。对我来说是有效的…现在…这是一个如此丑陋的错误!而且不容易破解,直到你发现你的触摸事件确实在某处…某处