2014-01-21 2 views
7

Ich habe eine Art Rollmechanismus für die Auswahl von Mitarbeitern in der Anwendung entwickelt. Es ist Custom View Pager, die erlaubt, mehr als ein Element auf dem Bildschirm bei jedes Mal (3 in meinem Fall) und umgeben von Schatten von beiden Seiten zu präsentieren.Problem mit dem benutzerdefinierten ViewPager-Rendering auf bestimmten Geräten:

hier ist, wie es aussehen sollte und funktioniert wie folgt auf Geräten wie dem Nexus 5, Nexus 4, Galaxy S3:

enter image description here

Aber bei einigen Geräten wie (Sony Xperia, und verschiedene Arten von Motorola) sieht das Rendering schlecht aus, hier ist das Ergebnis:

enter image description here

den Code Bezüglich ich von @Commonsware zu diesem Blog-Eintrag referierte:

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

Und die dritte Option gibt, den Code, den Sie here finden können.

Hier ist mein entsprechender Code:

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 Teil:

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

Weitere Forschung hat mich, dass dieses Problem etwas zu tun hat, zu verstehen, mit der Hardwarebeschleunigung oder dem Mangel in einigen Geräten. Aber das Deaktivieren über den Code hat mir auch nicht geholfen.

Hat jemand dieses Problem entdeckt und weiß, wie man es beheben kann?

Vielen Dank im Voraus.

Antwort

0

ich beendet habe eine andere Implementierung ein ViewPager mit, die mir das gleiche Ergebnis gab aber das Rendering-Problem wurde nicht, wo es gesehen wird, ist dies der Code:

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

und die Initialisierung Teil:

pagerType= (ViewPager) view.findViewById(R.id.pagerType); 
pagerType.setAdapter(new MyTypePagerAdapter()); 
pagerType.setOffscreenPageLimit(6); 
2

Ich würde versuchen, die layerType des ViewPager und seine Kinder auf Software-Render, anstatt der Eltern-Frame-Layout.

Vielleicht haben Sie auch diese Blog-Post prüfen wollen: http://udinic.wordpress.com/2013/09/16/viewpager-and-hardware-acceleration/

+0

Vielen Dank für Ihre Antwort, ich habe jetzt mehr klare Vorstellung, warum diese happ ist en, aber Ihre Lösung und die Lösung im Blogpost haben mir noch nicht geholfen. aber +1 für die Mühe. –