2D Scrolling, поддержка RTL макета - PullRequest
0 голосов
/ 28 марта 2019

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

https://github.com/mukulraw/rekhta/blob/master/app/src/main/java/com/example/mukul/rekhta/TwoDScrollView.java

Но, когда мы переключаемся на RTL, возникают две проблемы:

  • childview обрезается
  • Изначально не хочет прокручиваться влево, но позволяет прокручивать вправо (от дочернего вида).

Я пытался посмотреть исходный код для Horizontal scrollview - который правильно обрабатывает rtl.До сих пор я видел только две ссылки на rtl в коде: во время onLayout().Когда я пытаюсь сделать что-то похожее, мой детский взгляд просто исчезает.

До сих пор я не нашел других решений, поддерживающих как 2d-прокрутку, так и RTL.Итак, я надеюсь разрешить это здесь для себя и для будущей души, которой нужно нечто подобное.

1 Ответ

0 голосов
/ 28 марта 2019

Хорошо, так что соберите это из целого ряда различных решений:

  1. Создание двух пользовательских компонентов, один расширяющий ScrollView, а другой расширяющий горизонтальный вид прокрутки:

    public class VScroll extends ScrollView {
    
     public VScroll(Context context, AttributeSet attrs, int defStyle) {
       super(context, attrs, defStyle);
     } 
    
     public VScroll(Context context, AttributeSet attrs) {
      super(context, attrs);
     }
    
     public VScroll(Context context) {
       super(context);
     }
    
     @Override
     public boolean onTouchEvent(MotionEvent ev) {
       return false;
     } 
    }
    

    И

    public class HScroll extends HorizontalScrollView {
    
     public HScroll(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
     }
    
     public HScroll(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
    
     public HScroll(Context context) {
         super(context);
     }
    
     @Override
     public boolean onTouchEvent(MotionEvent ev) {
         return false;
     }
    }
    
  2. в упражнении, в котором вам нужен «2d скроллер», используйте следующее: в OnCreate ():

        vScroll = findViewById(R.id.vScroll);
        hScroll = findViewById(R.id.hScroll);
    

, а затем

private VelocityTracker mVelocityTracker;
private float mx, my;
private float curX, curY;
private boolean started;

@Override
public boolean onTouchEvent(MotionEvent event) {

  if (mVelocityTracker == null) {
     mVelocityTracker = VelocityTracker.obtain();
  }
  mVelocityTracker.addMovement(event);

  curX = event.getX();
  curY = event.getY();
  int dx = (int) (mx - curX);
  int dy = (int) (my - curY);
  switch (event.getAction()) {
     case MotionEvent.ACTION_MOVE:
        if (started) {
            vScroll.smoothScrollBy(0, dy);
            hScroll.smoothScrollBy(dx, 0);
        } else {
            started = true;
        }
        mx = curX;
        my = curY;
        break;
      case MotionEvent.ACTION_UP:
        final VelocityTracker velocityTracker = mVelocityTracker;
        velocityTracker.computeCurrentVelocity(1000);
        int initialXVelocity = (int) velocityTracker.getXVelocity();
        int initialYVelocity = (int) velocityTracker.getYVelocity();
        vScroll.fling(-initialYVelocity);
        hScroll.fling(-initialXVelocity);

        if (mVelocityTracker != null) {
          mVelocityTracker.recycle();
          mVelocityTracker = null;
        }
        break;
    }
    return true;
}

Это допускает двунаправленную прокрутку (да, даже диагональ), а также некоторую скорость, чтобы учесть эффект «броска». Лучше всего, он прекрасно работает с макетами RTL и LTR! Надеюсь, это будет полезно и для кого-то еще ...

РЕДАКТИРОВАТЬ: Забыли добавить XML часть:

<pack.customcomponents.VScroll android:layout_height="fill_parent"
    android:layout_width="fill_parent" android:id="@+id/vScroll">
    <pack.customcomponents.HScroll android:id="@+id/hScroll"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/white"
            android:id="@+id/view_to_scroll"/>
    </pack.customcomponents.HScroll>
</pack.customcomponents.VScroll>
...