【问题标题】:Android - scrollTo() on ScrollView doesn't work properlyAndroid - ScrollView 上的 scrollTo() 无法正常工作
【发布时间】:2016-04-20 08:39:59
【问题描述】:

我使用的是 Titanium SDK 5.1.2.GA。我在 Android 和 iOS 上有一个类似 TabGroup 的栏。我在视图中没有完全可见时移动滚动,然后单击该选项卡。

在 iOS 上完美运行,但在 Android 上无法正常运行。

这是我移动滚动视图的代码:

if((view.rect.x + view.rect.width) > (toolbarX + $.toolbar.rect.width)){
    $.toolbar.scrollTo(((view.rect.x + view.rect.width) - $.toolbar.rect.width) + 10, 0);
}else if(view.rect.x < toolbarX){
    $.toolbar.scrollTo(view.rect.x - 10, 0);
}

$.toolbar -> 滚动视图

视图 -> 选项卡

这张照片解释了我的问题:

我在互联网上看到了这张 JIRA 票 https://jira.appcelerator.org/browse/TIMOB-17954

这会是问题吗??

编辑

这个问题是由 Appcelerator 上的新单位系统引起的。

我的 tiapp.xml 上有这一行

<property name="ti.ui.defaultunit" type="string">dp</property>

但是 Titanium 上的其他函数在 px 上返回它们的值,所以这是一个问题。

我现在的问题是:

  • 什么单元返回事件侦听器,如“滚动”? (px 或 dp) 因为我的 toolbarX = e.x 来自滚动事件
  • 哪些单位需要scrollTo(x,y)????

【问题讨论】:

  • 安卓有什么问题?也许您必须在 Android 上使用以下命令将坐标 dp 转换为 px:docs.appcelerator.com/platform/latest/#!/api/…。如果您使用Alloy,您可以使用这个完美运行的小部件(或查看小部件代码来解决您的问题)github.com/manumaticx/pagingcontrol
  • 谢谢@ThomasLemaitre 我不知道这个小部件。我会尝试它,因为 dp 到 px 也不起作用
  • 您链接的票确实似乎是问题所在。但我可以问一下,为什么你要使用 Views 和 ScrollViews 来构建它,而不是使用看起来与你的截图一模一样的内置 TabGroup?
  • 因为我需要在 iOS 上同样的显示。什么单位返回滚动事件? px 还是 dp?
  • 还有scrollTo()???您必须将单位放在 px 或 dp 中???

标签: appcelerator appcelerator-mobile appcelerator-titanium


【解决方案1】:

解决方案:

if(Alloy.Globals.isAndroid){
            var measure = require('alloy/measurement');

            //Vemos si tenemos que mover la toolbar
            if((view.rect.x + view.rect.width) > (toolbarX + $.toolbar.rect.width)){
                $.toolbar.scrollTo(((measure.dpToPX(view.rect.x) + measure.dpToPX(view.rect.width)) - measure.dpToPX($.toolbar.rect.width)) + 10, 0);
            }else if(view.rect.x < toolbarX){
                $.toolbar.scrollTo(measure.dpToPX(view.rect.x) - 10, 0);
            }
        }else{
            //Vemos si tenemos que mover la toolbar
            if((view.rect.x + view.rect.width) > (toolbarX + $.toolbar.rect.width)){
                $.toolbar.scrollTo(((view.rect.x + view.rect.width) - $.toolbar.rect.width) + 10, 0);
            }else if(view.rect.x < toolbarX){
                $.toolbar.scrollTo(view.rect.x - 10, 0);
            }
        }
    }

$.toolbar.addEventListener('scroll', function(e){

    Ti.API.info("-- toolbarX: " + e.x + " / " + Alloy.Globals.measure.pxToDP(e.x));

    if(Alloy.Globals.isAndroid){
        toolbarX = Alloy.Globals.measure.pxToDP(e.x);
    }else{
        toolbarX = e.x;
    }
});

这个问题是新的,因为:

<property name="ti.ui.defaultunit" type="string">dp</property>

现在,您必须猜测必须以什么单位(px 或 dp)在 Android 上传递值,因为某些函数返回 px,需要 px,而其他函数需要 dp。

【讨论】:

    【解决方案2】:

    这对我有用

    if (OS_ANDROID) {
        $.tabbar.scrollTo(Util.DPUnitsToPixels(x), 0);
    } else {
        $.tabbar.scrollTo(x, 0);    
    }   
    

    在android上将dp转换为像素

    【讨论】:

    • 你如何获得dp?是android上的默认度量吗?