Пользовательская проблема рендеринга ViewPager на некоторых устройствах:

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

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

Введите описание изображения здесь

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

Введите описание изображения здесь

Что касается кода, который я ссылался на это сообщение в блоге от @Commonsware :

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

И третий вариант там, какой код вы можете найти здесь .

Вот мой соответствующий код:

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

Больше исследований привело меня к пониманию того, что эта проблема имеет какое-то отношение к ускорению аппаратного обеспечения или отсутствию на некоторых устройствах. Но отключение этого кода не помогло мне.

Кто-то столкнулся с этой проблемой и знает, как ее исправить?

Заранее спасибо.

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

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

Я закончил использовать другую реализацию 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); 
Intereting Posts