今天都到一段代码,在onDestroy()方法中,使用了下面的代码:
mHandler.removeCallbacksAndMessages(null);
一开始我完全看不懂,我为什么参数是null,如果是null还需要移除什么Callbacks和Messages。后来察看官方文档有以下说明:
地址:http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages%28java.lang.Object%29
public final void removeCallbacksAndMessages(Object token)
Added in API level 1
Remove any pending posts of callbacks and sent messages whose obj istoken. If token is null, all callbacks and messages will be removed.
上面的意思是说,如果参数为null的话,会将所有的Callbacks和Messages全部清除掉。
这样做的好处是在Acticity退出的时候,可以避免内存泄露。
下面给大家分享一篇关于利用ListView实现圆弧列表的方法,希望此教程对各位安卓开发者会带来帮助哦。-
如何在圆弧内绘制图片?
-
如何让列表按照圆弧的轨迹滑动?
-
P(x) = centerX + cos(alpha) *r.
-
P(y) = centerY - sin(alpha) * r.
我讲创建一个展示的列表作为样例。列表中的图片来自于资源文件夹。你可以参考我上传的源代码.
代码如下 | 复制代码 |
int[] playerDrawableResourceIds = new int[] { R.drawable.ronaldo, |
如何在圆弧中绘制图片?
首先,创建一个列表项的类CircleDrawItem.
代码如下 | 复制代码 |
public class CircleDrawItem { public Bitmap mIconBitmap; public double mAngle; } |
mIconBitmap: 列表项的位图.
mAngle: 每个列表项的弧度。这个弧度在旋转列表项的时候会被更新.
因为该圆弧将被在屏幕左侧展示。所以圆心将会把X坐标设置为负数。同时,Y坐标将被设置为屏幕中心的Y坐标值.
代码如下 | 复制代码 |
mCenterX = (int) (-Global.dp * 200); mCenterY = (int) (Global.dh / 2.0f); mRadius = (int) (450 * Global.dp); mStartAngleInRadian = Math.PI / 4; |
用Global 的值进行计算:
代码如下 | 复制代码 |
Global.dw = getResources().getDisplayMetrics().widthPixels; Global.dh = getResources().getDisplayMetrics().heightPixels; Global.dp = Global.density / 1.5f; |
这个圆弧保有CircleDrawItem的数组列表。第一项的弧度为PI/4。每个列表项的间隔是PI/10.第一项的弧度和两项间的弧度可以根据你的需求进行修改。
代码如下 | 复制代码 |
for (int i = 0; i < playerDrawableResourceIds.length; i++) { CircleDrawItem circleDrawItem = new CircleDrawItem(); circleDrawItem.mIconBitmap = decodeSampledBitmapFromResource( getResources(), playerDrawableResourceIds[i], 50, 50); circleDrawItem.mAngle = mStartAngleInRadian - i * Math.PI / 10; datas.add(circleDrawItem); } |
我创建了一个线程,以便将每个数据项绘制到圆弧中。
代码如下 | 复制代码 |
protected void draw() { Canvas canvas = getHolder().lockCanvas(); if (canvas == null) { return; } canvas.save(); canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setFilterBitmap(true); paint.setAntiAlias(true); for (int i = 0; i < datas.size(); i++) { canvas.save(); CircleDrawItem item = datas.get(i); double x = mCenterX + Math.cos(item.mAngle) * mRadius; double y = mCenterY - Math.sin(item.mAngle) * mRadius; canvas.drawBitmap(item.mIconBitmap, (int) x - item.mIconBitmap.getWidth() / 2, (int) y - item.mIconBitmap.getHeight() / 2, paint); canvas.restore(); } canvas.restore(); getHolder().unlockCanvasAndPost(canvas); } |
如何让列表在圆弧中滑动?
引用OnGestureListener 并重载onScroll()函数。
代码如下 | 复制代码 |
|
计算滑动角度的方法如下:
代码如下 | 复制代码 |
|
背景
我们需要简单的访问XML来解析XML文档.因此,你只要知道在XML文档代码里结果的位置地方,然后解析它就很简单.举个例子,在下面这张图里,我们想要知道有关突尼斯的斯法克斯的天气:
一开始,我们需要指定我们想要知道天气的城市或者州.
代码如下 | 复制代码 |
String c = city.getText().toString(); |
然后, 我们开始解析XML文档.
代码如下 | 复制代码 |
public class HandlingXmlStuff extends DefaultHandler { |
我们需要指定我们的数据模型和使用的功能.
代码如下 | 复制代码 |
public class XMLDataCollected { int temp= 0; String city=null ; public void setCity(String c) { city= c ; } public void setTemp(int t ) { temp = t ; } public String dataToString() { return "In"+city+" the current Temp in F is "+ temp+" degrees"; } } 。 |
兴趣点
在这个方案里, 你学会了在Android应用里如何使用XML解析来轻松制作许多功能
在Unity工程的Assets目录内,有一些文件夹的名称具有特殊意义,有专门的用途,将其收集列举如下.
ActionScript
存放Flash的ActionScript脚本。当游戏被导出为Flash格式的时候,这里的脚本会自动替换指定的C#脚本。
Editor
存放编辑器脚本。
Gizmos
通常是存放TIF格式的图片,在OnDrawGizmos函数内使用Gizmos.DrawIcon将其画为图标在场只中显示。
Plugins/Android
存放Android插件,包括.jar或XML文件等。
Plugins/iOS
存放iOS插件,包括.a或.m 或 .mm文件等。
Resources
存放使用Resources.Load()动态读取的资源,它们可以是图片、模型等不同类型的资源。
Standard Assets
标准Unity资源包。
StreamingAssets
独立存放到文件系统中媒体文件,如视频等。
WebPlayerTemplates
存放网页游戏模版,其中的每个模版均以-个自定义名称的子目录形式存放。
当然,我们也可以通过在Menifest里面的meta-data标签来定义一个值,然后在我们的应用中直接去读取即可,这样,下次如果需要修改值,我们就不必再找到我们的代码了,而是在修改我们的版本号的时候,一起就可以修改了。更加方便与便捷。
这样的应用场景在给多市场打包的时候,你一定见过。比如友盟,有米的sdk里面就有一步为:在 application标签下定义一个meta-data来为不同的市场赋值和传入不同的appId。
那么我们的自己应用里面应该如何去定义meta-data的值呢?并且怎么在代码中取出我们要想的值 呢?
那么点击更多,跟着我一起来看看如何操作吧!!!
形如:
代码如下 | 复制代码 |
<application ...> <meta-data android:value="12345" android:name="APPID"/> <activity ...> <meta-data android:name="data_Name" android:value="hello my activity"></meta-data> </activity> </application> |
从上面可以看出,我们的meta-data不仅仅是可以放到application标签下面,也可以放到activity下面,其实也可以放到service ,receiver下面。。。
我们分别来看看如何获取的吧?
1.获取 application标签中的meta-data:
形如:
代码如下 | 复制代码 |
<application...> ApplicationInfo appInfo = context.getPackageManager() |
2.获取 activity标签中的meta-data:
形如:
代码如下 | 复制代码 |
<activity ...> <meta-data android:value="my_activity" android:name="data_Name"/> </activity> |
代码:
代码如下 | 复制代码 |
ActivityInfo activityInfo = context.getPackageManager() . getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA); String dataName=activityInfo.metaData.getString("data_Name"); |
注意:activity.getComponentName()为获取activity实例的ComponentName 也可以用下面的代替:
代码如下 | 复制代码 |
//通过指定一个activity类来生成一个新的ComponentName ComponentName componentName =new ComponentName(context, SplashActivity.class); |
3.获取 service标签中的meta-data:
形如:
代码如下 | 复制代码 |
< service ...> <meta-data android:value="my_service" android:name="data_Name"/> </service > |
代码:
代码如下 | 复制代码 |
ComponentName componentName=new ComponentName(context, MyService.class); ServiceInfo serviceInfo = context.getPackageManager() . getServiceInfo(componentName, PackageManager.GET_META_DATA); String dataName=serviceInfo.metaData.getString("data_Name"); |
注意:在Service里面就没有getComponentName()方法来快速获取到当前的ComponentName了,所以只能通过指定service类的方式来生成一个新的ComponentName
4.获取 receiver标签中的meta-data:
形如:
代码如下 | 复制代码 |
< receiver ...> <meta-data android:value="my_receiver" android:name="data_Name"/> </receiver > |
代码:
代码如下 | 复制代码 |
ComponentName componentName=new ComponentName(context, MyService.class); ActivityInfo activityInfo = context.getPackageManager() . getReceiverInfo(componentName, PackageManager.GET_META_DATA); www.111cn.net String dataName=activityInfo.metaData.getString("data_Name"); |
注意:在receiver可没有 ReceiverInfo了,而是用的activityInfo来处理的。
最后的注意:我们在获取值的时候都是使用的 是:xxxInfo.metaData.getString(“data_Name”);把所有的值都当成是String来获取的,如果在meta- data中是int型的,如果还是使用getString()方法获取出来的值是为空的,但是metaData提供了这么多种get方法来获取 。
如果metadata 的数据类型是没办法确定的,那么可以直接使用 Object object = metaData.get(key)来获取 ,然后再转化成自己要想的数据类型。