【android】getX和getRawX的用法区别

在实现event.move中view跟着手指移动的功能时,发现getX和getRawX虽然都能实现,但是仔细研究起来还是有所区别的。
首先在getRawX方法中

int currentx=(int)event.getRawX();
int currenty=(int)event.getRawY();
switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastx = currentx;
                lasty = currenty;
                break;
            case MotionEvent.ACTION_MOVE:
                int temx = currentx-lastx;
                int temy = currenty-lasty;
                layout(getLeft()+temx,getTop()+temy,getRight()+temx,getBottom()+temy);
                lastx = currentx;
                lasty = currenty;
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                break;
        }

流程应该没什么,在down中获取当前的位置,在Move中移动到新位置减去down中的位置获取差值,再用layout去重新设置布局。这样会很丝滑。但是如果将第一行的event.getRawX()替换成event.getX()后,会发现view非常不跟手以及停在某一点后会极度的抖动。
分析原因:
假设view的大小为200*200,getX()获取为100,在down的那一刻,lastx=100,接下来的移动过程中假设移动到159的位置,此时差值50,于是layout开始移动50,移动后将当前的150赋值给lastx,那么此时我们会发现手指按理来说带着view移动,相对于view的位置是不变的,结果现在变了,因此会出现抖动,不停的改变位置。此时可以去掉

lastx = currentx;
lasty = currenty;

两行,保持lastx对于view的相对位置的不变,于是会发现跟手没有抖动。代码如下:

        int currentx=(int)event.getX();
        int currenty=(int)event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastx = currentx;
                lasty = currenty;
                break;
            case MotionEvent.ACTION_MOVE:
                int temx = currentx-lastx;
                int temy = currenty-lasty;
                layout(getLeft()+temx,getTop()+temy,getRight()+temx,getBottom()+temy);
//                lastx = currentx;
//                lasty = currenty;
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                break;
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用 GetX 库中的 Obx 方法时,可以使用 async 和 await 实现异步操作。 例如,在一个 Obx 函数中调用一个异步函数,并使用 await 关键字等待返回结果: ``` final myValue = Obx(() async { var value = await someAsyncFunction(); return value; }); ``` 在这个例子中,someAsyncFunction() 是一个异步函数,Obx 包装了它并返回一个 Obx 对象。 当 someAsyncFunction() 返回时,Obx 会自动刷新并通知所有依赖它的 widgets 进行更新。 需要注意,在 Obx 中使用 await 的情况,需要确保 Obx 函数是 async 的。 ### 回答2: 在Flutter的GetX库中,我们可以使用`Obx`方法来实现响应式更新。`Obx`方法接受一个返回`Rx`对象的回调函数作为参数,并在该回调函数中监听数据的变化。在`Obx`回调函数中,我们可以使用`async`和`await`来执行异步操作,以实现更复杂的逻辑。 要在`Obx`方法中使用`async`和`await`,首先定义一个`Rx`对象,例如`RxInt`、`RxString`或`RxList`等,作为需要监听和更新的数据。 接下来,我们可以在`Obx`回调函数中使用`async`关键字来标记该函数为异步函数。然后,可以使用`await`关键字来等待异步操作的结果。 例如,我们可以在`Obx`回调函数中调用一个异步函数,等待其执行完成后更新数据: ``` final count = RxInt(0); void fetchData() async { // 模拟一个耗时的异步操作 await Future.delayed(Duration(seconds: 2)); // 更新count的值 count.value = 10; } Obx(() { return Text('Count: ${count.value}'); }); ``` 在上面的例子中,`count`是一个`RxInt`对象,用来表示需要更新的数据。`fetchData`是一个异步函数,模拟一个耗时的操作,并在操作完成后更新`count`的值。在`Obx`回调函数中,使用`Text`组件显示`count`的值。 当调用`fetchData`函数时,由于其内部包含`await`关键字,程序会等待异步操作完成后再进行下一步的处理。一旦异步操作完成,`count`的值会发生变化,从而触发`Obx`回调函数的执行,更新界面上展示的`Text`组件的内容。 总结来说,在GetX库中,我们可以在`Obx`方法中使用`async`和`await`来执行异步操作,从而实现动态更新界面的效果。 ### 回答3: 在Flutter的GetX库中,Obx方法并不能直接使用async和await关键字。Obx是GetX库中的一个观察者小部件,用于侦听并响应任何被观察对象(例如Rx变量)的更改。但是,可以通过使用RxStream或RxWorker来实现类似于async和await的功能。 要在Obx中实现异步操作,可以使用RxStream。首先,创建一个RxStream对象,并使用StreamController将异步操作包装成一个流。然后,在Obx方法内部,使用Obx(() {})方法来订阅RxStream。每当这个流的数据发生变化时,Obx方法将被调用,可以在其中更新UI。 以下是一个示例代码: ```dart final count = RxInt(0); void incrementCount() async { await Future.delayed(Duration(seconds: 1)); count.value++; } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Async Operation')), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Obx(() => Text('Count: ${count.value}')), ElevatedButton( child: Text('Increment'), onPressed: incrementCount, ), ], ), ), ); } ``` 在这个示例中,我们使用RxInt来管理一个计数器,名为count。在incrementCount方法中,我们使用async和await关键字模拟了一个异步操作,通过延迟1秒钟来增加计数。在UI中,我们使用Obx(() {})方法订阅了count。每当count发生变化时,Obx内部的匿名函数就会被触发,并在Text小部件中更新显示。 总结来说,尽管Obx方法本身不能直接使用async和await关键字,但可以结合使用RxStream或RxWorker来实现类似的异步操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值