在Android中,有时需要对控件进行测量,得到的控件宽度和高度可以用来做一些计算。在需要自适应屏幕的情况下,这种计算就显得特别重要。另一方便,由于需求的原因,希望一进入界面后,就能得到控件的宽度和高度。
可惜的是,根据我的验证,利用网上转载的那些方法在OnCreate函数中获取到的仍然是0(希望搞技术的能自己验证过再转载),例如Measure方法之后调用getMeasuredWidth的值还是0。
原因是因为当OnCreate函数发生时,只是提供了数据初始化的机会,此时还没有正式绘制图形。而绘制图形在OnDraw中进行,此时计算又显得太晚。容易想到的办法是:希望能在程序刚刚测量好某个指定控件后,拿到它的宽度和高度立刻进行计算或数据初始化。这就需要有一个方法来监听到这个事件的发生,幸好Android提供了这样的机制,利用View类中的getViewTreeObserver方法,可以获取到指定View的观察者,在绘制控件前的一刹那进行回调,这样速度上又不耽误,得到的数据由是准确的,但此方法在之后可能会被反复调用,因此需要加入限制,普通需求下,只计算一次就够了,代码如下(此代码在OnCreate回调函数中验证通过,实时上,因为它是监听器,所以发生事件时已经和OnCreate无关了):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
layout = (MetroLayout) findViewById(R.id.layout);
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
{
public boolean onPreDraw()
{
if (hasMeasured == false)
{
int height = metroLayout.getMeasuredHeight();
int width = metroLayout.getMeasuredWidth();
//获取到宽度和高度后,可用于计算
hasMeasured = true;
}
return true;
}
});
原文作者: 皇马船长
原文地址: http://my.eoe.cn/cainiao1/archive/14760.html
2013年9月21日星期六
2013年6月5日星期三
GPX
GPX
GPX(GPS eXchange Format, GPS交换格式)是一个XML格式,为应用软件设计的通用GPS数据格式。
它可以用来描述路点、轨迹、路程。这个格式是免费的,可以在不需要付任何许可费用的前提下使用。它的标签保存位置,海拔和时间,可以用来在不同的GPS设备和软件之间交换数据。如查看轨迹、在照片的exif数据中嵌入地理数据。
数据类型
在GPX中,一个没有顺序关系的点集合,叫路点。一个有顺序的点的集合叫轨迹或者路程。轨迹是一个人曾经走过的记录,路程是一个建议的下一步要走的地方。所以,一般来讲,轨迹里的点,包含时间信息,路程里的点,没有时间信息。
最小的一个GPX文件,仅仅包含一个经纬度坐标的点,其它的都是可选的。
示例
下面这个GPX文件(局部)是由Garmin Oregon 400t手持GPS设备产生,这个文件展示了GPX格式的功能。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" creator="Oregon 400t" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
<metadata>
<link href="http://www.garmin.com">
<text>Garmin International</text>
</link>
<time>2009-10-17T22:58:43Z</time>
</metadata>
<trk>
<name>Example GPX Document</name>
<trkseg>
<trkpt lat="47.644548" lon="-122.326897">
<ele>4.46</ele>
<time>2009-10-17T18:37:26Z</time>
</trkpt>
<trkpt lat="47.644548" lon="-122.326897">
<ele>4.94</ele>
<time>2009-10-17T18:37:31Z</time>
</trkpt>
<trkpt lat="47.644548" lon="-122.326897">
<ele>6.87</ele>
<time>2009-10-17T18:37:34Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" creator="Oregon 400t" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
<metadata>
<link href="http://www.garmin.com">
<text>Garmin International</text>
</link>
<time>2009-10-17T22:58:43Z</time>
</metadata>
<trk>
<name>Example GPX Document</name>
<trkseg>
<trkpt lat="47.644548" lon="-122.326897">
<ele>4.46</ele>
<time>2009-10-17T18:37:26Z</time>
</trkpt>
<trkpt lat="47.644548" lon="-122.326897">
<ele>4.94</ele>
<time>2009-10-17T18:37:31Z</time>
</trkpt>
<trkpt lat="47.644548" lon="-122.326897">
<ele>6.87</ele>
<time>2009-10-17T18:37:34Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
参见
- Concepts
- Point of Interest
- OpenStreetMap, a collaborative project to create free editable maps using GPX traces.
- 文件格式
- 可交换图像文件
- GML
- KML, the equivalent format compatible with Google Earth.
- 软件
参考
2013年5月27日星期一
SimpleCursorAdapter 貌似很好用的样子
new ImageAdapter(MainActivity.this, R.layout.griditem, getImageCursor(),new String[] {}, new int[] {});
class ViewHolder {
ImageView testimg;
}
class ImageAdapter extends SimpleCursorAdapter {
public ImageAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
}
@Override
public void changeCursor(Cursor c) {
super.changeCursor(c);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View v = super.newView(context, cursor, parent);
ViewHolder vh = new ViewHolder();
vh.testimg = (ImageView) v.findViewById(R.id.test);
v.setTag(vh);
return v;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder vh = (ViewHolder) view.getTag();
int imageid = cursor.getInt(0);
Bitmap temBitmap = MediaStore.Images.Thumbnails.getThumbnail(context.getContentResolver(), imageid,
MediaStore.Images.Thumbnails.MINI_KIND, null);
vh.testimg.setImageBitmap(temBitmap);
}
}
2013年4月17日星期三
接入微博weibo.sdk.android.sso.jar后功能正常,混淆打包过后调用崩溃的解决方案。
混淆后具体的报错日志如下
W/System.err(30242): java.io.FileNotFoundException: weibosdk_dialog_bg.9.png
W/System.err(30242): at android.content.res. AssetManager.openAsset(Native Method)
W/System.err(30242): at android.content.res. AssetManager.open( AssetManager.java:337)
W/System.err(30242): at android.content.res. AssetManager.open( AssetManager.java:311)
W/System.err(30242): at com.weibo.sdk.android. WeiboDialog.setUpWebView( WeiboDialog.java:128)
W/System.err(30242): at com.weibo.sdk.android. WeiboDialog.onCreate( WeiboDialog.java:88)
W/System.err(30242): at android.app.Dialog. dispatchOnCreate(Dialog.java: 307)
W/System.err(30242): at android.app.Dialog.show( Dialog.java:225)
W/System.err(30242): at com.weibo.sdk.android.Weibo. startDialog(Weibo.java:129)
W/System.err(30242): at com.weibo.sdk.android.Weibo. startAuthDialog(Weibo.java:71)
W/System.err(30242): at com.weibo.sdk.android.sso. SsoHandler.authorize( SsoHandler.java:122)
W/System.err(30242): at com.weibo.sdk.android.sso. SsoHandler.authorize( SsoHandler.java:106)
W/System.err(30242): at android.view.View. performClick(View.java:2486)
W/System.err(30242): at android.view.View$ PerformClick.run(View.java: 9130)
W/System.err(30242): at android.os.Handler. handleCallback(Handler.java: 587)
W/System.err(30242): at android.os.Handler. dispatchMessage(Handler.java: 92)
W/System.err(30242): at android.os.Looper.loop(Looper. java:130)
W/System.err(30242): at android.app.ActivityThread. main(ActivityThread.java:3703)
W/System.err(30242): at java.lang.reflect.Method. invokeNative(Native Method)
W/System.err(30242): at java.lang.reflect.Method. invoke(Method.java:507)
W/System.err(30242): at com.android.internal.os. ZygoteInit$ MethodAndArgsCaller.run( ZygoteInit.java:841)
W/System.err(30242): at com.android.internal.os. ZygoteInit.main(ZygoteInit. java:599)
W/System.err(30242): at dalvik.system.NativeStart. main(Native Method)
/System.err(30242): java.io.FileNotFoundException: values/dimens.xml
W/System.err(30242): at android.content.res. AssetManager.openAsset(Native Method)
W/System.err(30242): at android.content.res. AssetManager.open( AssetManager.java:337)
W/System.err(30242): at android.content.res. AssetManager.open( AssetManager.java:311)
W/System.err(30242): at com.weibo.sdk.android. WeiboDialog.parseDimens( WeiboDialog.java:260)
W/System.err(30242): at com.weibo.sdk.android. WeiboDialog.setUpWebView( WeiboDialog.java:163)
W/System.err(30242): at com.weibo.sdk.android. WeiboDialog.onCreate( WeiboDialog.java:88)
W/System.err(30242): at android.app.Dialog. dispatchOnCreate(Dialog.java: 307)
W/System.err(30242): at android.app.Dialog.show( Dialog.java:225)
W/System.err(30242): at com.weibo.sdk.android.Weibo. startDialog(Weibo.java:129)
W/System.err(30242): at com.weibo.sdk.android.Weibo. startAuthDialog(Weibo.java:71)
W/System.err(30242): at com.weibo.sdk.android.sso. SsoHandler.authorize( SsoHandler.java:122)
W/System.err(30242): at com.weibo.sdk.android.sso. SsoHandler.authorize( SsoHandler.java:106)
W/System.err(30242): at android.view.View. performClick(View.java:2486)
W/System.err(30242): at android.view.View$ PerformClick.run(View.java: 9130)
W/System.err(30242): at android.os.Handler. handleCallback(Handler.java: 587)
W/System.err(30242): at android.os.Handler. dispatchMessage(Handler.java: 92)
W/System.err(30242): at android.os.Looper.loop(Looper. java:130)
W/System.err(30242): at android.app.ActivityThread. main(ActivityThread.java:3703)
W/System.err(30242): at java.lang.reflect.Method. invokeNative(Native Method)
W/System.err(30242): at java.lang.reflect.Method. invoke(Method.java:507)
W/System.err(30242): at com.android.internal.os. ZygoteInit$ MethodAndArgsCaller.run( ZygoteInit.java:841)
W/System.err(30242): at com.android.internal.os. ZygoteInit.main(ZygoteInit. java:599)
W/System.err(30242): at dalvik.system.NativeStart. main(Native Method)
D/AndroidRuntime(30242): Shutting down VM
W/dalvikvm(30242): threadid=1: thread exiting with uncaught exception (group=0x40015568)
E/AndroidRuntime(30242): FATAL EXCEPTION: main
E/AndroidRuntime(30242): android.content.res.Resources$ NotFoundException: Resource ID #0x7f040000 type #0x3 is not valid
E/AndroidRuntime(30242): at android.content.res.Resources. getDimensionPixelSize( Resources.java:531)
E/AndroidRuntime(30242): at com.weibo.sdk.android. WeiboDialog.setUpWebView( WeiboDialog.java:171)
E/AndroidRuntime(30242): at com.weibo.sdk.android. WeiboDialog.onCreate( WeiboDialog.java:88)
E/AndroidRuntime(30242): at android.app.Dialog. dispatchOnCreate(Dialog.java: 307)
E/AndroidRuntime(30242): at android.app.Dialog.show( Dialog.java:225)
E/AndroidRuntime(30242): at com.weibo.sdk.android.Weibo. startDialog(Weibo.java:129)
E/AndroidRuntime(30242): at com.weibo.sdk.android.Weibo. startAuthDialog(Weibo.java:71)
E/AndroidRuntime(30242): at com.weibo.sdk.android.sso. SsoHandler.authorize( SsoHandler.java:122)
E/AndroidRuntime(30242): at com.weibo.sdk.android.sso. SsoHandler.authorize( SsoHandler.java:106)
E/AndroidRuntime(30242): at android.view.View. performClick(View.java:2486)
E/AndroidRuntime(30242): at android.view.View$ PerformClick.run(View.java: 9130)
E/AndroidRuntime(30242): at android.os.Handler. handleCallback(Handler.java: 587)
E/AndroidRuntime(30242): at android.os.Handler. dispatchMessage(Handler.java: 92)
E/AndroidRuntime(30242): at android.os.Looper.loop(Looper. java:130)
E/AndroidRuntime(30242): at android.app.ActivityThread. main(ActivityThread.java:3703)
E/AndroidRuntime(30242): at java.lang.reflect.Method. invokeNative(Native Method)
E/AndroidRuntime(30242): at java.lang.reflect.Method. invoke(Method.java:507)
E/AndroidRuntime(30242): at com.android.internal.os. ZygoteInit$ MethodAndArgsCaller.run( ZygoteInit.java:841)
E/AndroidRuntime(30242): at com.android.internal.os. ZygoteInit.main(ZygoteInit. java:599)
E/AndroidRuntime(30242): at dalvik.system.NativeStart. main(Native Method)
先开始想了很多,尝试了很多方法去解决。比如想是不是混淆除了什么问题。昨天弄了一天都没弄好。
今天又开始仔细看这个报错日志,然后在官方的Demo中找到sdk源码,定位到报错的这两句。于是尝试把Demo中assets中的资源拷贝到我的项目的assets文件夹中,混淆打包过后,调用正常了,哈哈哈。
昨天查了N的资料和用三种方式联系了官方技术支持都无果,最后还是要靠自己啊 :)
订阅:
博文 (Atom)