如何获取android:anyDensity值

如何获取android:anyDensity值,第1张

android:anyDensity的意思是支持任意密度,这个值只是一个布尔值设置。是android自己匹配的。

android中,可以获取密度,根据密度自己如果有需要可以做特殊处理:

DisplayMetrics metric = new DisplayMetrics()

getWindowManager().getDefaultDisplay().getMetrics(metric)

int width = metric.widthPixels // 屏幕宽度(像素)

int height = metric.heightPixels // 屏幕高度(像素)

float density = metric.density // 屏幕密度(0.75 / 1.0 / 1.5)

int densityDpi = metric.densityDpi // 屏幕密度DPI(120 / 160 / 240)

其他Draw文章参考:

Android中Drawable整体介绍

状态列表

StateListDrawable 是在 XML 中定义的可绘制对象,它根据对象的状态(State),使用多个不同的图像来表示同一个图形。例如,Button小部件可以是多种不同状态(按下、聚焦或这两种状态都不是)中的其中一种,而且可以利用状态列表可绘制对象为每种状态提供不同的背景图片。

您可以在 XML 文件中描述状态列表。每个图形由单一 <selector> 元素内的 <item> 元素表示。每个 <item> 均使用各种属性来描述应用作可绘制对象的图形的状态。

匹配规则:

在每个状态变更期间,将从上到下遍历状态列表,并使用第一个与当前状态匹配的项目 —此选择并非基于“最佳匹配”,而是选择符合状态最低条件的第一个项目。

在StateListDrawable中,一组item标签表示的是:状态列表。

必备。这必须是根元素。包含一个或多个 <item>元素。

属性:

xmlns:android

字符串。必备。定义 XML 命名空间,其必须是 " http://schemas.android.com/apk/res/android "。

android:constantSize

布尔值。如果可绘制对象报告的内部大小在状态变更时保持不变,则值为“true”(大小是所有状态的最大值);如果大小根据当前状态而变化,则值为“false”。默认值为 false。

StateListDrawable的固有大小是否不随着其状态的改变而改变,因为状态的改变会导致StateListDrawable切换到具体的Drawable,而不同的Drawable具有不同的固有大小。True表示StateListDrawable的固有大小保持不变,这时他的固有大小是内部所有Drawable的固有大小的最大值,false则会改变。

需要注意:如果是把这个drawable当做背景的话,那么这个drawable固有大小不管多大,都会拉伸到View的大小

如果给ImageView当做src使用,那么,false之后就会drawable的固有大小就变了,并且其并不会拉伸值ImageView的大小,可以得到一大一下的效果。

android:dither

布尔值。值为“true”时,将在位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕)启用位图的抖动;值为“false”时则停用抖动。默认值为 true。

android:variablePadding

布尔值。如果可绘制对象的内边距应根据选择的当前状态而变化,则值为“true”;如果内边距应保持不变(基于所有状态的最大内边距),则值为“false”。启用此功能要求您在状态变更时处理执行布局,这通常不受支持。默认值为 false。不建议开启此项

定义要在某些状态期间使用的可绘制对象,如其属性所述。必须是 <selector>元素的子项。

属性:

android:drawable

可绘制对象资源。必备。引用可绘制对象资源。

android:state_pressed

布尔值。如果在按下对象(例如触摸/点按某按钮)时应使用此项目,则值为“true”;如果在默认的未按下状态时应使用此项目,则值为“false”。比如ImageView,只有你设置android:clickable = true ,就可以满足

android:state_focused

布尔值。如果在对象具有输入焦点(例如当用户选择文本输入时)时应使用此项目,则值为“true”;如果在默认的非焦点状态时应使用此项目,则值为“false”。

android:state_hovered

布尔值。如果当光标悬停在对象上时应使用此项目,则值为“true”;如果在默认的非悬停状态时应使用此项目,则值为“false”。通常,这个可绘制对象可能与用于“聚焦”状态的可绘制对象相同。

此项为 API 级别 14 新引入的配置。

android:state_selected

布尔值。如果在使用定向控件浏览(例如使用方向键浏览列表)的情况下对象为当前用户选择时应使用此项目,则值为“true”;如果在未选择对象时应使用此项目,则值为“false”。

当焦点 (android:state_focused) 不充分(例如,列表视图有焦点但使用方向键选择其中的项目)时,使用所选状态。

android:state_checkable

布尔值。如果当对象可选中时应使用此项目,则值为“true”;如果当对象不可选中时应使用此项目,则值为“false”。(仅当对象可在可选中与不可选中小部件之间转换时才有用。)指示对象可以显示复选标记的状态标识符。比如checkbox

android:state_checked

布尔值。如果在对象已选中时应使用此项目,则值为“true”;如果在对象未选中时应使用此项目,则值为“false”。一般也是checkbox这类再选中和非选中之间进行切换的View.

android:state_enabled

布尔值。如果在对象启用(能够接收触摸/点击事件)时应使用此项目,则值为“true”;如果在对象停用时应使用此项目,则值为“false”。

android:state_activated

布尔值。如果在对象激活作为持续选择(例如,在持续导航视图中“突出显示”之前选中的列表项)时应使用此项目,则值为“true”;如果在对象未激活时应使用此项目,则值为“false”。

此项为 API 级别 11 新引入的配置。

android:state_window_focused

布尔值。如果当应用窗口有焦点(应用在前台)时应使用此项目,则值为“true”;如果当应用窗口没有焦点(例如,通知栏下拉或对话框出现)时应使用此项目,则值为“false”。

注:请记住,Android 将将使用状态列表中第一个与对象当前状态匹配的项目。因此,如果列表中的第一个项目不含上述任何状态属性,则每次都会应用它,这就是默认值应始终放在最后的原因(如以下示例所示)。因为有上面属性组成的状态列表,可能存在交集,所以就通过从上往下匹配,匹配到那个合适就采用哪一个。

这是在安卓上触发的,这是一个问题,因为我已经有了jQuery touchstart,touchend等事件,它们在iOS上工作得很好(也在安卓上触发)。在Android上,当触摸和点击事件都处于活动状态时,我点击元素,它就会显示出来,然后立即隐藏起来,再次点击就什么也不做了。但是,如果我注释掉click事件代码,它在Android上工作得很好。问题是,它需要在台式机上工作。我试过移除触摸事件,但在iOS上点击不起作用。我还尝试用单击事件替换mousedown,但没有任何更改。如何解决此问题?

下面是我的完整jQuery:

function handleOverlayInteraction() {

$('.mosaic-wrapper').on('mouseenter', function () {

$('#ddTestOverlay').show()

}).on('mouseleave', function () {

$('#ddTestOverlay').hide()

})

var dragged = false

$('.mosaic-wrapper').on('touchstart', function () {

dragging = false

})

$('.mosaic-wrapper').on('touchmove', function () {

dragging = true

})

$('.mosaic-wrapper').on('touchend', function () {

if (dragging) {

return

}

// Mobile single tap only

$('#ddTestOverlay').toggle()

})

$('#ddTestOverlay').on('click', function () {

$('#ddTestOverlay').toggle()

})

}

复制

浏览 47关注 0得票数 0

原文

1 个回答

高票数

*** 作

Paul已采纳

回答于2020-04-17

得票数 0

最后,我添加了一个clicked布尔变量,并在移动设备上单击时将其设置为true,然后在单击事件中检查它。基本上,触摸事件会在Android上触发,而click事件不会,但它仍然可以在桌面上工作,因为触摸事件不会在桌面上触发。更新的jQuery:

function handleOverlayInteraction() {

$('.mosaic-wrapper').on('mouseenter', function () {

$('#ddTestOverlay').show()

}).on('mouseleave', function () {

$('#ddTestOverlay').hide()

})

var dragged = false

var clicked = false

$('.mosaic-wrapper').on('touchstart', function () {

dragging = false

})

$('.mosaic-wrapper').on('touchmove', function () {

dragging = true

})

$('.mosaic-wrapper').on('touchend', function (e) {

if (dragging) {

return

}

// Mobile single tap only

clicked = true

$('#ddTestOverlay').toggle()

})

$('#ddTestOverlay').on('click', function (e) {

if (clicked) return

$('#ddTestOverlay').toggle()

})

}


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

原文地址: http://outofmemory.cn/tougao/11307360.html

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

发表评论

登录后才能评论

评论列表(0条)

保存