react-native 获取某一元素的绝对位置(相对于屏幕左上角)

react-native 获取某一元素的绝对位置(相对于屏幕左上角),第1张

DOM结构:

<View style={stylescheckContainer}  ref='checkContainer' onLayout={({nativeEvent:e})=>thislayout(e)}> 

</View>

对应js方法:

layout=(e)=>{

      consolewarn(elayouty)  ;

      var UIManager = require('UIManager');

      consolewarn(etarget);

      UIManagermeasure(etarget, (x, y, width, height, left, top) => {

     consolewarn('x:'+x)

     consolewarn('y:'+y)

     consolewarn('width:'+width)

     consolewarn('height:'+height)

     consolewarn('left:'+left)

     consolewarn('top:'+top)

})

}

注意:View组件的onLayout(可以得到宽高和相对位置)配合UIManagermeasure(可以得到宽高和绝对位置)一起使用

附加知识点:

得到某一dom元素的节点值:

import {findNodeHandle} from 'react-native';

var nodeData = findNodeHandle(thisrefsname);

nodeData即为节点值

多端阅读《javascript教程》:

在PC/MAC上查看:下载w3cschool客户端,进入客户端后通过搜索当前教程手册的名称并下载,就可以查看当前离线教程文档。下载javascript教程离线版客户端

在手机APP上查看:请从各大安卓应用商店、苹果App Store搜索并下载w3cschool手机客户端,在App中搜索当前教程手册的名称查看。下载w3cschool手机App端

在手机上查看文档:>

手册简介:

JavaScript 是世界上最流行的脚本语言。 JavaScript 是属于 web 的语言,它适用于 PC、笔记本电脑、平板电脑和移动电话。 JavaScript 被设计为向 HTML 页面增加交互性。 许多 HTML 开发者都不是程序员,但是 JavaScript 却拥有非常简单的语法。几乎每个人都有能力将小的 JavaScript 片段添加到网页中。

手册说明:

Javascript,从“最被误解的语言”,最后神奇地转变成为“最流行的语言”,证明它经受得起时间的考验。虽然单独来看,它的交互设计有些失败,但是加上Ajax的完美配合,javascript就成了一款轻便并且又实用的好语法。

如果您想要更高效、更系统地学会javascript,您最好采用边学边练(javascript微课)的学习模式。

如果您觉得javascript的学习难度较高,不易理解,建议您采用视频教程进行学习:javascript视频课程

接下来让我们静下心来,翻开这本关于Javascript的教程,你可以学习到JavaScript 代码规范、JavaScript 函数撰写、javascript 正则表达式、JavaScript 逻辑运算等基础内容,除此之外,本书还有进阶的Javascript高级教程,最好在熟读前面的基础知识之后,再考虑继续之后的教程。

高级教程当中包含的内容有很重要的JavaScript 对象介绍,JavaScript Window对象模型介绍,JavaScript 库以及JavaScript 实例等等,每一个章节都值得细细研读。

学完本教程之后,建议您进行javascript实战来巩固您学到的知识。

在雨课堂手机网页版中,将视频移动位置需要进行拖拽 *** 作。这是因为在网页中,视频通常是嵌入在页面中的元素之一,而这些元素都是基于HTML和CSS语言构建的,并且其位置和大小是由页面布局和样式表控制的。

因此,要移动视频的位置,需要通过改变视频所在元素的位置来实现。这可以通过在网页中使用JavaScript脚本来实现,具体方式是在脚本中获取视频所在元素的位置,然后通过 *** 作其CSS属性来改变其位置。在雨课堂手机网页版中,可以通过将手指按住视频并拖拽来触发此 *** 作。

需要注意的是,在实现视频拖拽功能时,开发者还需要考虑到一些其他的问题,例如拖拽的范围、拖拽时视频的尺寸和比例等等。同时,为了确保用户体验的流畅性,还需要优化代码和算法,以便在拖拽 *** 作中能够快速地响应用户的 *** 作。

css3之前,想要改变某个元素的位置,常用的方法是通过绝对定位改变其left或是top。而现在,由于css3新增加了transform属性,也可以通过改变translate来实现元素位置的变化。

制作改变某个元素位置的动画效果,尤其是在移动端上,如果使用left或者top,会出现明显的卡顿,在配置较低的手机上甚至会产生重影的现象。而改用translate,元素的运动效果则会变得相对流畅许多,且不会产生重影。

因为用left或top时,在每一帧内,cpu (中央处理器) 都需要计算该元素的其他样式,特别是相对需要复杂计算的盒阴影,渐变,圆角等样式,最后都需要将这些样式应用到该元素内。从这个角度看,如果对于较为老旧的移动设备进行相对复杂的动画,那么效果肯定不理想。

而通过调用translate,会启动硬件加速,即在GPU层 (图形处理器) 对该元素进行渲染。这样,CPU就会相对解放出来进行其他的计算,GPU对样式的计算相对较快,且保证较大的帧率。我们可以通过2d和3d的transform来启用GPU计算。

通过consolelog可以看到,transform的值是一个矩阵:

其中第5个数字和第6个数字分别对应translateX和translateY。

获取这个值的方法有三种,例如我们要获取slider-bar这个元素的translateX值:

方法1--解析矩阵:

WebKitCSSMatrix是专门用于 *** 作矩阵的函数。而m41就是translateX值,其中4代表第4列,1代表第一行。所以如果你还想获取translateY的值,就用m42。

方法2--正则:

方法3--字符串分割:

用typeof查看矩阵的类型,结果为字符串(string),所以也可以用字符串的方法split来分割。

当元素的display为none时,是获取不到transform的,设置如下样式

得到的结果为

所以在使用一些插件时,如果插件会将元素的display设置为none,那么就只能获取其他数值来替换transform的值。

难点:目标元素并不一定是absolute的,因此不能简单的通过top,left这种属性获取。元素可能包裹在n个父元素内,需要把这些因素都考虑进去。

解决思路:先获取该元素的offsetLeft和offsetTop,然后取它的offsetParent,并向外循环,累加这些left和top,最后得到的就是元素的绝对位置。

var obj = xxx; //这个元素就是目标元素,你可以用任何方式将它传入。  

  

var w = objoffsetWidth, h = objoffsetHeight;  

  

//从目标元素开始向外遍历,累加top和left值  

for (var t = objoffsetTop, l = objoffsetLeft; obj = objoffsetParent;) {  

        t += objoffsetTop;  

        l += objoffsetLeft;  

}

一、常见属性的用法

二、通过截图就可以看到元素的属性,那怎么元素定位呢?

三、问题

xpath 相对定位:如果相对定位中这个元素是有 id 的,这个 id 是唯一的,xpath 定位中优先通过 id 来定位。

class 属性对应的值是元素类型(是一个文本视图工具),Web 自动化中元素类型代表 Input、image、button 这样的标签名。

「resource-id 是唯一的,但是在 App 页面中并不绝对唯一。大部分情况下是唯一的,小部分情况下是重复的。」

如果一个页面中,元素的样式非常像,那很有可能它们的 id 就是一样的。UIAutomator Viewer 这个自带的工具是不能看出这个 id 是不是绝对唯一的。

「假设 resource-id 是唯一的,用相对定位这样定位:」

和 Web 自动化一样的玩法: 元素类型[@属性名称=属性值]

这里的 class 不是 Web 网页中的 class 属性了,这里代表它的标签名和元素类型(它是一个、一个文字、链接还是一个按钮呢?学会区分)。

如果 resource-id 不是唯一的,那么上面那个表达式是不够的,还会追加到上层的 Linearlayout 、 RelativeLayout 、包括祖先里面的一些层级都会放进来。

如果没有安装“升级 uiaumatorview-添加元素定位”就只能靠自己来判断。看下其它和它长得很像、元素的格式、风格、样式、页面布局都和它一模一样的元素,看下各位的 id 是否全都是一样的。

如果用了“升级 uiaumatorview-添加元素定位”,可以根据它的表达式自己来判断。

任何一个元素一定会有个 class,因为它是一个类别。Linearlayout 是一样的,布局也是安卓的控件,所以也会有控件名称、控件类型。

以下这些东西只有 2 个值,False 和 True。

以上这些属性在很多情况下是没有用的,但是在关键的时刻是很有用的。

例如想筛选当前页面中可以滚动的元素,通过 scrollable 等于 True 来过滤。

和 Web 自动化一样的,都是通过元素属性来定位,而且比 Web 自动化简单。

App 中只支持 5 种元素定位方式。虽然继承了 Web 自动化的元素定位,它之所以继承呢,是用到了其中的一个部分。

1、通过 id 定位元素:resrouce-id

2、通过 ClassName 定位:classname

3、通过 AccessibilityId 定位:content-desc

4、通过 AndroidUiAutomator 定位

5、通过 xpath 定位

1、通过 id 定位元素:resrouce-id

2、通过 ClassName 定位:classname

3、通过 xpath 定位

有 find_element_by_id() 就有 find_elements_by_id()

可以找到多个,它的返回值一样是列表。它的返回对象一样是 Web element 。

在它的下面有个 find_element_by_id() 。它的方法和 Web 自动化是一样的。

虽然这里代表的是元素类型,但它同样是 class 属性。

这里有点区别,但是方法名还是没有区别的。这个 class 的属性其实没有多大用处,一个页面中肯定很多属性的值和它很像的。所以这种用法不多。

既然是类别,可能有好多种,输入框也有好多种,它代表的是一种元素的类型。

「Web 自动化中 xpath 定位是最常用的,但是 App 自动化中 xpath 是最不想用的。原因是它的效率太低了。」

「如果全部只用 xpath 定位,问题会比较大,能不用 xpath 就不用 xpath」

AccessibilityId 是移动端特有的定位方式。

这是之前看到的类,这个类当中除了继承了 Web 自动化之外,对于安卓有 2 种,其中一种是 ACCESSIBILITY_ID 。

如果通过这种方式定位,对应的方式就是:

此处应输入 content-desc 的值,但是这里是空的,所以不能通过它定位。

但是 find_element_by_accessibility_id() 是另外一种 id,代表它在当前这个页面中也是很独特的。只要它有值,基本上可以通过它来定位。

用的是安卓 UiAutomator 这个自动化框架中提供的元素定位方式。所以想用这种元素定位方式,就必须了解它到底是怎么做的。

UiAutomator 自动化库是 Java 语言写的,所以它的参数是 Java 代码。UiAutomator 自动化库提供了 text。而 「元素有文本内容就可以通过文本内容来定位。」

这个里面的参数就必须是 UiAutomator 当中提供的定位方式。UiAutomator 是 Java 实现的,那么它的定位类型肯定也是 Java 实现的。

>

获取数组的元素位置:

public static void main(String[] args) {

int[] is = {28,7,15};

int i = 0;

// 需求:需要得到7在数组中的位置

for(int j=0;j<islength;j++ ){

if(is[j]==7){

i=j;

}

}

Systemoutprintln("7在数组下标"+i+"的位置");

// Systemoutprintln(is[i]);

}

以上就是关于react-native 获取某一元素的绝对位置(相对于屏幕左上角)全部的内容,包括:react-native 获取某一元素的绝对位置(相对于屏幕左上角)、js怎么获取数组中元素的位置、雨课堂手机网页版如何将视频移动位置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9818289.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存