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()
})
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)