Robotium 写了个滑动屏幕的方法,分享给大家

keen · 2015年03月10日 · 最后由 Jhon 回复于 2016年11月13日 · 2580 次阅读
本帖已被设为精华帖!

在 Robotium 群里看到有人问,如何滑动屏幕中的某个 view,有人说,需要根据屏幕的分辨率来计算。不需要这么麻烦的,下面的代码,可以随意滑动 view。

   /**
 * 重写drag方法,可以从view的任意点滑倒任意点.
 * 从view的最底部滑倒view的最上方,用来判断区域的滑动比例,可以选择滑动的比例是多少
 * dragPage(View view,float dragPercentFrom_X,float dragPercentFrom_Y,float dragPercentTo_X,float dragPercentTo_Y)
 * @param View                第一个参数是指定的view名称
 * @param dragPercentFrom_X   第二个参数是设置起点位置x的百分比
 * @param dragPercentFrom_Y   第三个参数是设置起点位置y的百分比
 * @param dragPercentTo_X     第四个参数是设置终点位置x的百分比
 * @param dragPercentTo_Y     第五个参数是设置终点位置x的百分比
 * 
 * 参考solo.drag(fromX, toX, fromY, toY, stepCount); 
 * 第一个参数是从起始点的横轴x点,等于view的左上角x坐标点+view的宽度百分比;默认百分比是view的0.5倍
 * 第二个参数是从起始点的横轴y点,等于view的左上角y坐标点+view的高度百分百
 * 第三个参数是从终点的横轴y点(滑动到的坐标点x轴),fromX+view的滑动的百分百
 * 第四个参数是从终点的横轴y点(滑动到的坐标点y轴),fromY+view的滑动的百分百
 * 第5个参数是拖动的步骤数,等于(屏幕滑动高度的平方+屏幕滑动高度的平方)的开根号/100
 */
public void dragPage(View view,float dragPercentFrom_X,float dragPercentFrom_Y,
        float dragPercentTo_X,float dragPercentTo_Y){
    // 存储view的高度和宽度
    int[] xyLocation = new int[2];
    // 存储view的xy坐标,左下角坐标值
    view.getLocationOnScreen(xyLocation);
    // 获取view的宽度
    final int viewWidth = view.getWidth();
    // 获取view的高度
    final int viewHeight = view.getHeight();        
    // 计算view的左上角的x坐标 
    final float viewLeftTop_x=xyLocation[0];
    // 计算view的左上角的y坐标
        final float viewLeftTop_y=xyLocation[1];        
        float FromX=viewLeftTop_x+viewWidth*dragPercentFrom_X;
        float FromY=viewLeftTop_y+viewHeight*dragPercentFrom_Y;   
        float ToX=viewLeftTop_x+viewWidth*dragPercentTo_X;
        float ToY=viewLeftTop_y+viewHeight*dragPercentTo_Y;
        float MoveX=ToX-FromX;
        float MoveY=ToY-FromY;
        int StepCount=(int)((Math.sqrt(Math.pow(MoveX,2.0)+Math.pow(MoveY, 2.0)))/100);
    solo.drag(FromX, ToX, FromY, ToY, StepCount);
    Log.d(TAG, "viewwidth"+" :"+String.valueOf(viewWidth)+" "+"viewheight"+":"+String.valueOf(viewHeight));
    Log.d(TAG, "xylocation[0]"+" :"+String.valueOf(xyLocation[0])+" "+"xylocation[1]"+":"+String.valueOf(xyLocation[1]));   
}
共收到 12 条回复 时间 点赞

@keen_lau 楼主,对于 LISTVIEW 或者 GROUPVIEW 有好的方法么?

第一个参数中 View view 中,View 类型怎么设定?

keen #3 · 2015年03月11日 Author

solo.getviews(id)来获取到 view

4楼 已删除

#3 楼 @keen_lau
StepCount=(int)((Math.sqrt(Math.pow(MoveX,2.0)+Math.pow(MoveY, 2.0)))/100)

请教一下,这个为啥需要写这么麻烦吗?有木有什么根据?

keen #6 · 2015年04月09日 Author

#5 楼 @pighero001 stepcount 指的指两点间移动的距离需要的步骤,以前填写的值,对于不同屏幕适配不合,后来在不同分辨率设备上调试了不同的最佳值,进而推导出这个公式

#6 楼 @keen_lau NX,这个很好,我很喜欢。哈哈,以前懒都只做的随意步骤就解决问题。

按照百分比滑动是跟通用的好方法. 千万不要写死一些具体数据.

@keen_lau 小白请教楼主 为什么我调用你的这个方法不滑动呢?使用如下 tt.dragPage(solo, solo.getView("product_detail_list"), 0, 0, 0,1); 注:当前 view 为 ExpandableListView,我的目的是向上滑动屏幕查看更多数据,打印信息如图

keen #10 · 2015年07月21日 Author

#9 楼 @wym1001
你百分百不要用 1,最好用小数,比如 0.9,接近于 1 就可以了

你好,solo.getviews(id)来获取到 view,我想问一下 ID 是什么的 ID 的值,我调用了楼主的方法,也是没有滑动哈 ns.dragPage(ns.getView("toDoItemDetailTv"), 0, 0, 0, 0.5f);

12楼 已删除

@param dragPercentTo_Y 第五个参数是设置终点位置 x 的百分比

应该是设置终点位置 y 的百分比。

为什么感觉没用呢,我是想 向上滑动一页数据;

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册