2D滚动,支持RTL布局

时间:2019-03-28 12:27:55

标签: android right-to-left

最近,我们开始添加对阿拉伯语的支持-它需要RTL布局。我们的屏幕之一使用2D滚动条,我在这里找到:

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

但是,当我们切换到RTL时,有两个问题:

  • childview被切断
  • 最初不希望向左滚动,但允许向右滚动(远离子视图)。

我尝试查看Horizo​​ntal scrollview的源代码-该代码可以正确处理rtl。到目前为止,我在代码中仅看到两个对rtl的引用:在onLayout()期间。但是,当我尝试类似的操作时,我的子视图消失了。

到目前为止,我找不到其他同时支持2d滚动和rtl的解决方案。因此,我希望在这里为我和将来需要类似事物的人解决它。

1 个答案:

答案 0 :(得分:0)

好吧,因此将其从一系列不同的解决方案中整合在一起:

  1. 创建两个自定义组件,一个扩展ScrollView,另一个扩展水平Scroll View:

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

    AND

    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>