最近,我们开始添加对阿拉伯语的支持-它需要RTL布局。我们的屏幕之一使用2D滚动条,我在这里找到:
但是,当我们切换到RTL时,有两个问题:
childview
被切断我尝试查看Horizontal scrollview
的源代码-该代码可以正确处理rtl。到目前为止,我在代码中仅看到两个对rtl的引用:在onLayout()
期间。但是,当我尝试类似的操作时,我的子视图消失了。
到目前为止,我找不到其他同时支持2d滚动和rtl的解决方案。因此,我希望在这里为我和将来需要类似事物的人解决它。
答案 0 :(得分:0)
好吧,因此将其从一系列不同的解决方案中整合在一起:
创建两个自定义组件,一个扩展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;
}
}
在需要“ 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>