2014-01-21 48 views
7

我开发了一种用于在应用程序中选择工作人员的滚动机制。 它是自定义视图传呼机,允许每次在屏幕上显示多于一个项目(在我的情况下为3),并用双方的阴影包围。在某些设备上自定义ViewPager呈现问题:

这里是它应该如何看待和工作原理是这样的设备,如的Nexus 5的Nexus 4银河S3

enter image description here

但像一些设备(索尼Xperia,以及不同种类的摩托罗拉)渲染看起来不好,这里是结果:

enter image description here

关于我的@Commonsware审阅本博客文章的代码:

http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html

还有第三个选项,你可以找到here哪些代码。

这里是我的相关代码:

PagerContainer:

public class PagerContainer extends FrameLayout implements ViewPager.OnPageChangeListener { 

    private ViewPager mPager; 
    boolean mNeedsRedraw = false; 

    public PagerContainer(Context context) { 
     super(context); 
     init(); 
    } 

    public PagerContainer(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public PagerContainer(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    private void init() { 
     //Disable clipping of children so non-selected pages are visible 
     setClipChildren(false); 

     //Child clipping doesn't work with hardware acceleration in Android 3.x/4.x 
     //You need to set this value here if using hardware acceleration in an 
     // application targeted at these releases. 
     if (Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT < 19) 
     { 
      setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
     } 
    } 

    @Override 
    protected void onFinishInflate() { 
     try { 
      mPager = (ViewPager) getChildAt(0); 
      mPager.setOnPageChangeListener(this); 
     } catch (Exception e) { 
      throw new IllegalStateException("The root child of PagerContainer must be a ViewPager"); 
     } 
    } 

    public ViewPager getViewPager() { 
     return mPager; 
    } 

    private Point mCenter = new Point(); 
    private Point mInitialTouch = new Point(); 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     mCenter.x = w/2; 
     mCenter.y = h/2; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     //We capture any touches not already handled by the ViewPager 
     // to implement scrolling from a touch outside the pager bounds. 
     switch (ev.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       mInitialTouch.x = (int)ev.getX(); 
       mInitialTouch.y = (int)ev.getY(); 
      default: 
       ev.offsetLocation(mCenter.x - mInitialTouch.x, mCenter.y - mInitialTouch.y); 
       break; 
     } 

     return mPager.dispatchTouchEvent(ev); 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     //Force the container to redraw on scrolling. 
     //Without this the outer pages render initially and then stay static 
     if (mNeedsRedraw) invalidate(); 
    } 

    @Override 
    public void onPageSelected(int position) { 
     invalidate(); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
     mNeedsRedraw = (state != ViewPager.SCROLL_STATE_IDLE); 
    } 
} 

初始化部分:

//Size View Pager: 
    //======================================== 
    pagerSize = mContainerSize.getViewPager(); 
    adapter = new MySizePagerAdapter(); 
    pagerSize.setAdapter(adapter); 
    //Necessary or the pager will only have one extra page to show make this at least however many pages you can see 
    pagerSize.setOffscreenPageLimit(adapter.getCount()); 
    //A little space between pages 
    pagerSize.setPageMargin(15); 
    //If hardware acceleration is enabled, you should also remove clipping on the pager for its children. 
    pagerSize.setClipChildren(false); 

更多的研究使我明白,这个问题有事可做硬件加速或在某些设备中缺少硬件加速。但通过代码禁用它也没有帮助我。

有人遇到这个问题,并知道如何解决它?

在此先感谢。

回答

0

我已经结束了使用ViewPager这给了我同样的结果,但渲染的问题是在那里看到任何地方的另一种实现方式,这是验证码:

private class MyTypePagerAdapter extends PagerAdapter { 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 

     TextView view = new TextView(getActivity()); 
     view.setText(mTempBeverageList.get(position).getName().toUpperCase()); 
     if (!wasTypeChanged && (!isLocaleHebrew && position == 1)) 
     { 
      view.setTypeface(null, Typeface.BOLD); 
      view.setTextSize(19); 
     } 
     else 
     { 
      view.setTextSize(16); 
     } 
     view.setSingleLine(); 
     view.setGravity(Gravity.CENTER); 
     view.setTextColor(getResources().getColor(R.color.cups_black)); 
     view.setBackgroundColor(getResources().getColor(R.color.cups_cyan)); 
     container.addView(view); 
     return view; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((View)object); 
    } 

    @Override 
    public int getCount() { 
     return mTempBeverageList.size(); 
    } 

    @Override 
    public float getPageWidth(int position) { 
     return (0.33333f); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return (view == object); 
    } 
} 

和初始化部分:

pagerType= (ViewPager) view.findViewById(R.id.pagerType); 
pagerType.setAdapter(new MyTypePagerAdapter()); 
pagerType.setOffscreenPageLimit(6); 
相关问题