Tag : android
Tag : android
将多个图片或shape按顺序层叠
demo如下:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <bitmap android:src="@drawable/android_red" android:gravity="center" /> </item> <item android:top="10dp" android:left="10dp"> <bitmap android:src="@drawable/android_green" android:gravity="center" /> </item> <item android:top="20dp" android:left="20dp"> <bitmap android:src="@drawable/android_blue" android:gravity="center" /> </item> </layer-list> |
通过设定不同的参数和item来使用,demo如下:
<?xml version="1.0" encoding="utf-8" ?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 默认时的背景图片--> <item android:drawable="@drawable/pic1" /> <!-- 没有焦点时的背景图片 --> <item android:state_window_focused="false" android:drawable="@drawable/pic1" /> <!-- 非触摸模式下获得焦点并单击时的背景图片 --> <item android:state_focused="true" android:state_pressed="true" android:drawable= "@drawable/pic2" /> <!-- 触摸模式下单击时的背景图片--> <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/pic3" /> <!--选中时的图片背景--> <item android:state_selected="true" android:drawable="@drawable/pic4" /> <!--获得焦点时的图片背景--> <item android:state_focused="true" android:drawable="@drawable/pic5" /> </selector> |
android:shape=[“rectangle” | “oval” | “line” | “ring”]
shape的形状,默认为矩形,可以设置为矩形(rectangle)、椭圆形(oval)、线性形状(line)、环形(ring)
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 圆角 --> <corners android:radius="9dp" android:topLeftRadius="2dp" android:topRightRadius="2dp" android:bottomLeftRadius="2dp" android:bottomRightRadius="2dp"/><!-- 设置圆角半径 --> <!-- 渐变 --> <gradient android:startColor="@android:color/white" android:centerColor="@android:color/black" android:endColor="@android:color/black" android:useLevel="true" android:angle="45" android:type="radial" android:centerX="0" android:centerY="0" android:gradientRadius="90"/> <!-- 间隔 --> <padding android:left="2dp" android:top="2dp" android:right="2dp" android:bottom="2dp"/><!-- 各方向的间隔 --> <!-- 大小 --> <size android:width="50dp" android:height="50dp"/><!-- 宽度和高度 --> <!-- 填充 --> <solid android:color="@android:color/white"/><!-- 填充的颜色 --> <!-- 描边 --> <stroke android:width="2dp" android:color="@android:color/black" android:dashWidth="1dp" android:dashGap="2dp"/> </shape> |
通过js调用native需要做以下几步:
1.在plugin.xml配置文件里,添加如下内容
<?xml version="1.0" encoding="utf-8"?> <uexplugins> <plugin className="com.test.testObject" uexName="test"> <method name="setAction"/> </plugin> </uexplugins> |
2.添加com.test.testObject类,添加如下内容
package com.test; import org.zywx.wbpalmstar.engine.EBrowserView; import org.zywx.wbpalmstar.engine.universalex.EUExBase; import org.zywx.wbpalmstar.engine.universalex.EUExCallback; public class testObject extends EUExBase { private Context context; public testObject(Context context, EBrowserView inParent) { super(context, inParent); } @Override protected boolean clean() { return false; } public void setAction(String[] message){ //TODO jsCallback("test.setActionCallBack",0, EUExCallback.F_C_JSON,message[0]); } } |
setAction里面可以设定需要native做的操作,demo里直接设定了回调给js
3.js调用添加,在需要调用的页面添加js内容如下
function setAction(message){ test.setAction(message); } window.uexOnload = function(type){ if(type == 0){ test.setActionCallBack = function(opId,dataType,data){ //TODO alert(data); }; } } |
通过setAction进行调用,最终会把message以消息的方式弹出.
Categories: Android, javaScript, 前端开发, 移动开发
android应用数据统计使用方法和配置方式:
manifest的配置主要包括添加权限,填写Appkey和填写渠道id三部分,代码示例如下:
<manifest……> <uses-sdk android:minSdkVersion="4"></uses-sdk> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <application ……> …… <activity ……/> <meta-data android:value="APP_KEY" android:name="APPKEY"></meta-data> <meta-data android:value="Channel ID" android:name="CHANNEL"/> </application> </manifest> |
APPKEY也可在Activity中配置:只需在程序启动时的Activity中调用此接口:
StatisticsConfig.setAppkey(String appkey)
需要在服务端日志记录入口手动添加相应的appkey
CHANNEL也可在Activity中配置:只需在程序启动时的Activity中调用此接口:
StatisticsConfig.setChannel(String channel)
提醒:每台设备仅记录首次安装激活的渠道,如果该设备再次安装其他渠道包,则数据仍会被记录在初始的安装渠道上。
正确集成如下代码,才能够保证获取正确的新增用户、活跃用户、启动次数、使用时长等基本数据。
在每个Activity中如下调用相应内容:
public void onResume() {
super.onResume();
Statistics.onResume(this);
}
public void onPause() {
super.onPause();
Statistics.onPause(this);
}
确保在所有的Activity中都调用 Statistics.onResume() 和Statistics.onPause()方法,这两个调用将不会阻塞应用程序的主线程,也不会影响应用程序的性能。
注意如果您的Activity之间有继承或者控制关系请不要同时在父和子Activity中重复添加onPause和onResume方法,否则会造成重复统计,导致启动次数异常增高。
当应用在后台运行超过60秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口来自定义这个间隔(参数单位为毫秒)。
StatisticsConfig.setSessionContinueMillis(long interval)
如果调用 Process.kill 或者 System.exit 之类的方法杀死进程,请务必在此之前调用
Statistics.onKillProcess(Context context)
方法,用来保存统计数据。
如果页面不单由Activity组成,需在其包含的 Fragment 中统计页面:
public void onResume() {
super.onResume();
Statistics.onPageStart(“pageName”);
}
public void onPause() {
super.onPause();
Statistics.onPageEnd(“pageName”);
}
需要注意的是这些方法的调用,需要保证线性不交叉,每个 start 都有一个 end 配对,如下:
onPageStart ->onPageEnd-> onPageStart -> onPageEnd -> onPageStart ->onPageEnd
这样才能保证每个页面统计的正确
目前的发送策略采用启动时发送:APP启动时发送当次启动数据和上次的使用时长等缓存数据,当次使用过程中产生的自定义事件数据缓存在客户端,下次启动时发送
自定义事件提交,可根据事件的使用场景定义不同的type,name,key,value值
Statistics.setEvent(String type,String name,String key,String value)
是否启动数据上传,可在应用内部进行设置,可在应用内根据用户当前网络状态进行判断,wifi下发送等策略,默认不发送
Statistics.setUpdateOnline(boolean b)
统计发送因为用户关闭网络访问导致发送失败,可关闭统计功能,连续统计发送失败次数累计超过默认值自动关闭统计,可在应用内部进行设置,默认:10次
Statistics.setErrorNum(int i)
如统计发生错误,可在应用内部设定debug模式,对相关信息进行检查,默认false logKey:FDX->Statistics
Statistics.setDebug(boolean b)
数据格式:
post: 访问数据包
u: uuid => 设备唯一标识
m: param => [ip,网络类型] 存入每次访问数据的more字段中
t: time => 发送时间
k: token => 访问令牌(访问key+发送时间md5)
v: value => [一次访问,一次访问]
一次访问:session,新session产生时保存
=[访问次数,访问时间,访问过程,事件列表]
事件列表
=[事件,事件,事件]
=[[事件时间,事件分类,事件名,key,value],[事件时间,事件分类,事件名,key,value]]
访问过程:先进先出
=[一次start到end,一次start到end]
=[[访问名称,开始时间,结束时间,页面列表],[访问名称,开始时间,结束时间,页面列表]]
页面列表:字典 {pagename:starttime,pagename:starttime}
=[一次page,一次page]
=[[页面名称,开始时间,结束时间],[页面名称,开始时间,结束时间]]
post:新增数据包
t: time => 发送时间
k: token => 访问令牌(访问key+发送时间md5)
v: value => [deviceId, mac, osName, osVersion, brandModel, appVersion]