2014-01-21 3 views
7

Я разработал своего рода механизм качения для выбора персонала в приложении. Это пользовательский пейджер, который позволяет отображать более одного элемента на экране по адресу каждый раз (3 в моем случае) и окружен тенью с обеих сторон.Пользовательская проблема рендеринга ViewPager на некоторых устройствах:

вот как он должен выглядеть и как это работает на устройствах, как Nexus 5, Nexus 4, Galaxy S3:

enter image description here

Но на некоторых устройствах, таких как (Sony Xperia и различные виды Motorola) рендеринг выглядит плохо, вот результат:

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); 
    } 
} 

Init часть:

//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); 
2

Я бы попробовал установить layerType ViewPager и его дочерние программы для рендеринга программного обеспечения вместо родительского макета.

Вы также можете проверить этот блог: http://udinic.wordpress.com/2013/09/16/viewpager-and-hardware-acceleration/

+0

Спасибо за ваш ответ, теперь у меня есть более четкое представление о том, почему это Happ но ваше решение и решение в блоге по-прежнему не помогли мне. но +1 за усилие. –

Смежные вопросы