2D滚动,支持RTL布局

问题描述 投票:0回答:1

最近,我们开始添加对阿拉伯语的支持 - 这需要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的其他解决方案。所以,我希望在这里为我和一些需要类似东西的灵魂解决它。

android right-to-left
1个回答
0
投票

好吧,所以从一堆不同的解决方案中把它放在一起:

  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>
© www.soinside.com 2019 - 2024. All rights reserved.