2017-07-24 1 views
0

Ich habe eine Recycleransicht erstellt, die zoomt, aber der Teiler zoomt nicht mit der Ansicht, sodass die Trennlinien auf der gleichen Höhe bleiben, obwohl der Inhalt der Recycleransicht vergrößert wird. Wie mache ich den Teiler Zoom mit der Recyclerview? Danke im Voraus!Implementierung von RecyclerView Zoom mit Teilern

Hauptaktivität:

recyclerView = (ZoomRecyclerView) findViewById(R.id.recyclerView); 

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); 
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
recyclerView.setLayoutManager(linearLayoutManager); 
recyclerView.setHasFixedSize(true); 

recyclerViewAdapter = new RecyclerViewAdapter(listOfData); 
if (recyclerView!= null) { 
    recyclerView.setAdapter(recyclerViewAdapter); 
} 

Drawable divider = ContextCompat.getDrawable(this, R.drawable.divider); 
RecyclerViewDecorator recyclerViewDecorator = new RecyclerViewDecorator(divider); 
recyclerView.addItemDecoration(recyclerViewDecorator); 

divider.xml Drawable Datei:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <size android:height="2dp"></size> 
    <solid android:color="@android:color/black"></solid> 
</shape> 

Recycler anzeigen Decorator:

public class RecyclerViewDecorator extends RecyclerView.ItemDecoration { 

private Drawable divider; 

public RecyclerViewDecorator(Drawable divider) { 
    this.divider = divider; 
} 

@Override 
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { 
    int dividerLeft = parent.getPaddingLeft(); 
    int dividerRight = parent.getWidth() - parent.getPaddingRight(); 
    int dividerTop; 
    int dividerBottom; 

    int childCount = parent.getChildCount(); 
    for (int i = 0; i < childCount - 1; i++) { 
     View child = parent.getChildAt(i); 

     RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 

     dividerTop = child.getBottom() + params.bottomMargin; 
     dividerBottom = dividerTop + divider.getIntrinsicHeight(); 

     divider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom); 
     divider.draw(canvas); 
    } 
} 

@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    super.getItemOffsets(outRect, view, parent, state); 

    if (parent.getChildAdapterPosition(view) == 0) { 
     return; 
    } 

    outRect.top = divider.getIntrinsicHeight(); 
} 
} 

Zooming Recycler Ausblick:

public class ZoomRecyclerView extends RecyclerView { 
private ScaleGestureDetector scaleGestureDetector; 
private static final String TAG = ZoomRecyclerView.class.getSimpleName(); 

private float scaleFactor = 1.f; 
private static final float minScale = 1.0f; 
private static final float maxScale = 3.0f; 

public ZoomRecyclerView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    scaleGestureDetector = new ScaleGestureDetector(getContext(), new ScaleGestureDetector.OnScaleGestureListener() { 
     @Override 
     public boolean onScale(ScaleGestureDetector detector) { 
      scaleFactor *= detector.getScaleFactor(); 

      //makes sure user does not zoom in or out past a certain amount 
      scaleFactor = Math.max(minScale, Math.min(scaleFactor, maxScale)); 

      //refresh the view and compute the size of the view in the screen 
      requestLayout(); 

      return true; 
     } 

     @Override 
     public boolean onScaleBegin(ScaleGestureDetector detector) { 
      return true; 
     } 

     @Override 
     public void onScaleEnd(ScaleGestureDetector detector) { 

     } 
    }); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 

    //notify the scaleGestureDetector that an event has happened 
    scaleGestureDetector.onTouchEvent(event); 

    return true; 
} 

@Override 
protected void dispatchDraw(@NonNull Canvas canvas) { 
    canvas.save(); 

    //scales the display, centered on where the user is touching the display 
    canvas.scale(scaleFactor, scaleFactor, scaleGestureDetector.getFocusX(), scaleGestureDetector.getFocusY()); 

    super.dispatchDraw(canvas); 
    canvas.restore(); 

} 

} 

Antwort

0

Endlich herausgefunden, nur für den Fall, dass jemand anderes das gleiche Problem hat. Anstelle der Funktion onDraw() im ItemDecorator sollte es onDrawOver() sein. Dies liegt daran, dass onDraw() die Teiler vor der Ansicht zeichnet und onDrawOver() die Teiler nach der Ansicht zeichnet. Wenn also die Ansicht vergrößert wird, ändern sich die Teiler damit.

Verwandte Themen