我在肚子右面疼的imageurl里插入的图片,但是播放时不显示,,,浏览器也不显示,,,怎么回事啊

小站会根据您的关注,为您发现更多,
看到喜欢的小站就马上关注吧!
下一站,你会遇见谁的梦想?
android模拟器启动PANIC: could not open.android/avd/XXX.ini错误
Step1: 在环境变量中新建一个&系统变量&,ANDROID_SDK_HOME=D:\Program Files\android-sdk-windows(根据实际具体路径来配置);
Step2: 修改系统变量Path,在前面添加%Android_SDK_HOME%/让它指向第一步设置的ANDROID_SDK_HOME就行了。
Android应用开发之(检测底座(Dock)的状态和类型)
&&&& Android 设备可能放入多种类型的底座中,包含车载底座和家庭桌面底座以及数字/模拟底座等。有些底座连接有电源,所以大部分底座都可以给设备充电。
&&& 根据程序提供的不同功能,当设备插入不同种类的底座种需要的数据更新频率是不同的。比如一个实时导航程序在设备插入车载底座的时候,可能就需要增大数据更新频率来获取交通状况信息;而对于体育比赛类的程序在车载底座下应该减少数据更新频率。
&&& 底座状态的变化也会触发消息,通过该消息可以检测设备是否放到底座中以及底座的类型。
&检测设备是否放到底座中
&&& 在通知的Intent中包含了具体的底座类型。由于该通知是密集型(sticky)的,所以您不需要注册一个来接受该通知。您只要调用并且设置其参数为 null 即可获取详细的信息,如下所示:
IntentFilter ifilter =newIntentFilter(Intent.ACTION_DOCK_EVENT); Intent dockStatus = context.registerReceiver(null, ifilter);
可以从 EXTRA_DOCK_STATE 字段中获取是否放入底座中:
intdockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1); booleanisDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;
检测底座类型
如果在底座中,有不同的底座类型:
Car 车载底座
Desk 桌面底座
Low-End (Analog) Desk 低端模拟底座
High-End (Digital) Desk 高端数字底座
注意:后面两种底座类型在Android 3.0(API Level 11)版本中引入,所以一种比较通用的做法就是检测是否是后面三种类型的底座而不是单独检测每一个,如下所示:
booleanisCar = dockState == EXTRA_DOCK_STATE_CAR; booleanisDesk = dockState == EXTRA_DOCK_STATE_DESK || dockState == EXTRA_DOCK_STATE_LE_DESK || dockState == EXTRA_DOCK_STATE_HE_DESK;
&& 检测底座状态的改变&p当设备插入或者拔出底座的时候都会触发广播事件。只需要在Manifest中注册一个Receiver即可监听底座状态的改变,如下所示:
&action android:name="android.intent.action.ACTION_DOCK_EVENT"/&
使用上面的示例代码您可以在Receiver中查询底座的类型。
Android应用开发之(如何开发精品应用)
如果想要在移动设备上做一款精品应用,应该尽量减少对用户设备电池的消耗。
我们可以通过检测用户电量然后根据不同的电量情况来修改您程序的功能。
当断开网络连接的时候,禁用后台的更新服务;当设备电量比较少的时候,减少更新的频率,这样就可以减少您的程序最电量的消耗了,而不用去伤害用户的正常使用。
检测电池电量和充电状态
当我们想要更改后台数据的刷新速率来减少对用户影响的时候,先检测下当前的剩余电量和充电状态是个不错的开始。
在执行更新数据操作对用户电池寿命的影响取决于当前的剩余电量和充电状态。当设备在通过交流电充电的时候去更新数据对设备电池寿命的影响是微不足道 的,所以在大部分情况下当设备在使用交流电充电的时候,您都可以最大化您的数据更新频率。相反的,如果设备没有在充电,减少更新速率会延长设备电池的使用 寿命。
同样,您还可以检测电池电量信息,当剩余电量很少的时候,您可以减少更新频率 甚至停止更新。
检测当前的充电状态
会广播所有的电池和充电详细信息,通过可以获取这些状态。
由于这是个密集型(sticky)通知,所以您不需要注册一个,只要简单的调用registerReceiver 该函数并设置参数为 null 即可获得到包含了电池信息的Intent,当然您也可以设置一个对象作为参数,我们会在后面小节中看到这种情况,暂时我们先设置其为null吧, 代码如下:
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter);
如果当前设备正在充电的话,您还可以获取具体的充电方式 & 通过USB或者交流电充电:
// Are we charging / charged? int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // How are we charging? int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
当设备在使用交流电充电的时候,您可以最大化数据更新频率;如果在使用USB充电,您应该减少更新频率;如果没有在充电 更新频率应该更小。
检测充电状态的改变
设备是否充电是经常发生的,所以根据设备是否充电来修改更新频率是非常重要的。
无论设备充电或者停止充电都会广播一个消息。即使您的程序没有正在运行也应该监听这个事件,这样您可以根据不同的状态来判断是否需要启动后台更新程序。您可以在Manifest文件中注册一个同时监听和消息的。
&receiver android:name=".PowerConnectionReceiver"& &intent-filter& &action android:name="android.intent.action.ACTION_POWER_CONNECTED"/& &action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/& &/intent-filter& &/receiver&
在这个实现中,可以查询当前的状态。
public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BATTERY_PLUGGED_AC; } }
检测当前剩余电量
有些情况下根据当前剩余电量做些改动也是有用的。当电量低于一定值的时候可以修改后台数据的更新频率。
您可以通过如下示例代码来获取剩余电量信息:
int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)
检测明显的电量改变
你无法很轻松的检查连续的电池状态改变,而且您也无需这么做。
一般来说,联系的检查电量信息可能比您后台更新数据还要费电,所以只监听一些重要的电量状态比较有意义,例如监听合适设备进入或者离开低电状态。
下面的示例代码中的Receiver只监听设备进入低电状态或者离开低电状态的变化;使用了和这两个Intent过滤器。
&receiver android:name=".BatteryLevelReceiver"& &intent-filter& &action android:name="android.intent.action.ACTION_BATTERY_LOW"/& &action android:name="android.intent.action.ACTION_BATTERY_OKAY"/& &/intent-filter& &/receiver&
一般来说,当电量极其少的时候,关闭后台数据更新是个不错的做法。当用户没电关机了您的数据再新都没有意义哇。
有些情况下设备会放到底座上使用,后面会讲述如何判断当前的底座状态以及检测底座的变化。
报道称Android 5将在第二季度发布
&&&&&& 台湾媒体DigiTimes引用供应链的匿名消息称,Google可能在第二季度发布代号&Jelly Bean&的操作系统Android 5.0,它可能在功能上与Chrome OS进行整合,能运行在笔记本、平板电脑和智能手机上。未来Android和Chrome OS合二为一不是没有可能,Google最近已将Chrome浏览器移植到Android 4上。DigiTimes的报道还声称,硬件制造商将生产能运行Android 5 和Windows 8双系统的平板产品,允许用户不用重启就能在Android和Windows操作系统间进行切换。  由于Android 4的表现欠佳,很多Google的下游者表示会尽快的转入到Android 5.0中去。
android应用内截图的代码实现
View view= getWindow().getDecorView();
Bitmap bmp = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);
view.draw(new Canvas(b));bmp就是截取的图片了,可通过<press(CompressFormat.PNG, 100, new FileOutputStream(file));把图片保存为文件。方法二:
getWindow().getDecorView().setDrawingCacheEnabled(true);bmp=getWindow().getDecorView().getDrawingCache();但这样得到的图片是包含状态栏和标题栏的,如果想把状态栏和标题栏去掉,可把得到的图片顶部一部分剪裁掉。1、得到状态栏高度
Rect rect = new Rect();view.getWindowVisibleDisplayFrame(rect);int statusBarHeight = rect.System.out.println("状态栏高度:" + statusBarHeight);2、得到标题栏高度
int wintop = getWindow().findViewById(android.R.id.content).getTop();int titleBarHeight = wintop - statusBarHSystem.out.println("标题栏高度:" + titleBarHeight);注:这样得到的截图是不会包含dialog和popupwindow的,你必须单独得到popupwindow的截图,然后再和背景截图合到一起。另外,截图的相关代码是不能放到oncreate中的,因为这时候getDectorView()得到的是null把两个bitmap合到一起的方法很简单。Bitmap bmpall=Biatmap.createBitmap(width,height,Config.ARGB_8888);Canvas canvas=new Canvas(bmpall);canvas.drawBitmap(bmp1,x,y,paint);canvas.drawBitmap(bmp2,x,y,paint);得到的bmpall就是合在一起的图片了。&ps:按理说也getWindow.findViewById(android.R.id.content)得到的view就是不包含状态栏和标题栏的view,但这个我还没有试过。
分享45个android实例源码
andriod闹钟源代码
源码分享之指南针程序
重力感应的测试程序andriod源代码
android源码分享之时光日志个人日程管理
OpenGL的一个简单的例子
文件管理器-android源代码
&Txt文本阅读器源码
Android远程登录含有loading登录效果~~完整代码和超级详细注释
Android 手电筒源码
Android操作数据库实例
android 画图程序
Android 天气预报加widget源码
Android 指南针程序
Android 个人记账程序源码
Android游戏的心跳效果
Android PDF 阅读器源码
Android SqliteManager 源码
android 多点触控实例源码
Android 条码扫描程序源码
EditText插入QQ表情源码
AsyncTask进度条加载网站数据到ListView
android连接SQLite数据库-----增加改查+分页
Android 一个批量删除联系人的Demo
TXT 文本阅读器源码(android源码分享)
android 查询工具源代码
android进度条对话框Demo
Android实现渐显按钮的左右滑动效果
android天气预报源码
Android 文件浏览器源码
android源码分享之私密通讯录源码
Android自定义泡泡效果 源码
android 获取Gps信息的程序源码
android 超炫的图片浏览器
android 加载时闪烁点样式的启动画面
实现基于Android的英文电子词典
基于 Android 的英文电子词典
android 源码之英语单词记忆程序源码
andorid 源码北京公交线路查询(离线)
Android 计算器源码
带文字的ProgressBar Demo源码
android自定义时钟(三种方法实现,秒针效果,详细注解)
Android 秒表源码分享
Android源代码定时情景模式切换
android 公交查询
android源码分享之带手势划动功能的日历源码
Android应用开发之(内存分析工具MAT(Memory Analyzer Tool))
给大家介绍一下如何对Android应用进行内存分析,和常用的内存分析工具,希望朋友们能给喜欢!&
如果使用 DDMS 确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问 题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定会把人逼疯, 特别是在维护别人写的代码的时候。 这里介绍一个极好的内存分析工具-- Memory Analyzer Tool(MA T。)
MA T是一个 Eclipse 插件,同时也有单独的 RCP 客户端。官方下载地址、MA T介绍和 详细的使用教程请参见:www.eclipse.org/mat,在此不进行说明了。另外在 MAT安装后的 帮助文档里也有完备的使用教程。在此仅举例说明其使用方法。我自己使用的是 MA T的 eclipse 插件,使用插件要比 RCP 稍微方便一些。
使用 MAT进行内存分析需要几个步骤, 包括: 生.成hprof 文件、 打开MAT并导入.hprof 文件、使用 MAT的视图工具分析内存。以下详细介绍。
(一) 生成.hprof 文件
生成.hprof 文件的方法有很多,而且 Android 的不同版本中生成.hprof 的方式也稍有差 别,我使用的版本的是 2.1,各个版本中生成.prof 文件的方法请参考: http://android.git.kernel.org/?p=platform/dalvik.a=blob_f=docs/heap- profiling.hb=HEAD。
1. 打开 eclipse 并切换到 DDMS 透视图, 同时确认Devices、Heap 和 logcat 视图已经打开了; 2. 将手机设备链接到电脑,并确保使用&USB 调试&模式链接,而不是&Mass Storage&模 式; 3. 链接成功后在Devices视图中就会看到设备的序列号,和设备中正在运行的部分进程; 4. 点击选中想要分析的应用的进程,在 Devices 视图上方的一行图标按钮中,同时选中 &Update Heap&和&Dump HPROF file&两个按钮;
5. 这是 DDMS 工具将会自动生成当前选中进程的 .hprof 文件,并将其进行转换后存放在 sdcard 当中, 如果你已经安装了MAT插件, 那么此时MAT将会自动被启用, 并开始对.hprof 文件进行分析;
注意: 第4 步和第 5 步能够正常使用前提是我们需要有sdcard, 并且当前进程有向sdcard 中写入的权限(WRITE_EXTERNAL_STORAGE),否则.hprof 文件不会被生成,在 logcat 中 会显示诸如
ERROR/dalvikvm(8574): hprof: can't open /sdcard/com.xxx.hprof-hptemp: Permission denied.
7Android 内存泄漏调试
如果我们没有 sdcard, 或者当前进程没有向sdcard 写入的权限 (如system_process),那 我们可以这样做: 6. 在当前程序中,例如framework中某些代码中,可以使用android.os.Debug中的:
方法,手动的指定.hprof 文件的生成位置。例如:
上述代码意图是希望在 xxxButton 被点击的时候开始抓取内存使用信息, 并保存在我们 指定的位置:/data/temp/myapp.hprof,这样就没有权限的限制了,而且也无须用sdcard。但 要保证/data/temp 目录是存在的。这个路径可以自己定义,当然也可以写成sdcard 当中的某 个路径。
(二) 使用MAT导入.hprof文件
1. 如果是eclipse自动生成的.hprof文件, 可以使用MAT插件直接打开 (可能是比较新的ADT 才支持) ; 2. 如果 eclipse 自动生成的 .hprof 文件不能被 MA T 直接打开,或者是使用 android.os.Debug.dumpHprofData()方法手动生成的 .hprof 文件,则需要将 .hprof 文件进行转 换,转换的方法:
例如我将.hprof 文件拷贝到 PC 上的/ANDROID_SDK/tools 目录下,并输入命令 hprof- conv xxx.hprof yyy.hprof,其中xxx.hprof 为原始文件,yyy.hprof为转换过后的文件。转换过 后的文件自动放在/ANDROID_SDK/tools 目录下。OK, 到此为止,.hprof 文件处理完毕,可 以用来分析内存泄露情况了。 3. 在Eclipse中点击Windows-&OpenPerspective-&Other-&MemoryAnalyzer,或者打 Memory AnalyzerTool的 RCP。在MAT中点击 File-&OpenFile,浏览并导入刚刚转换而得到的.hprof 文件。
(三) 使用MAT的视图工具分析内存
导入.hprof 文件以后,MA T会自动解析并生成报告, 点击Dominator Tree, 并按Package 分组,选择自己所定义的 Package 类点右键,在弹出菜单中选择 List objects-&With incoming references。这时会列出所有可疑类,右键点击某一项,并选择 Path to GC Roots -& exclude weak/soft references,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪 到代码中的某一个产生泄露的类。
MA T的界面如下图所示。
具体的分析方法在此不做说明了,因为在MAT的官方网站和客户端的帮助文档中有十 分详尽的介绍。
了解 MAT中各个视图的作用很重要,例如www.eclipse.org/mat/about/screenshots.php中 介绍的。
总之使用 MAT分析内存查找内存泄漏的根本思路,就是找到哪个类的对象的引用没有 被释放,找到没有被释放的原因,也就可以很容易定位代码中的哪些片段的逻辑有问题了。
Android应用开发之(ListView性能优化)
做Android应用开发的朋友,应该都用过ListView吧!给大家分享一些,ListView性能优化方面的知识。
ListView是一种可以显示一系列项目并能进行滚动显示的View。在每行里,既可以是简单的文本,也可以是复杂的结构。一般情况下,你都需要 保证ListView运行得很好(即:渲染更快,滚动流畅)。在接下来的内容里,我将就ListView的使用,向大家提供几种解决不同性能问题的解决方 案。
如果你想使用ListView,你就不得不使用ListAdapter来显示内容。SDK中,已经有了几种简单实现的Adapter:
&&&&&&&&&&ArrayAdapter&T&&(显示数组对象,使用toString()来显示)
&&&&&&&&&&SimpleAdapter&(显示Maps列表)
&&&&&&&&&&SimpleCursorAdapter(显示通过Cursor从DB中获取的信息)
这些实现对于显示简单的列表来说,非常棒!一旦你的列表比较复杂,你就不得不书写自己的ListAdapter实现。在多数情况下,直接从 ArrayAdapter扩展就能很好地处理一组对象。此时,你需要处理的工作只是告诉系统如何处理列表中的对象。通过重写getView(int, View, ViewGroup)方法即可达到。
在这里,举一个你需要自定义ListAdapter的例子:显示一组图片,图片的旁边有文字挨着。
图片需要实时从internet上下载下来。让我们先创建一个Class来代表列表中的项目:
public&class&ImageAndText {
&&&&private&String imageU
&&&&private&S
&&&&public&ImageAndText(String imageUrl, String text) {
&&&&&&&&this.imageUrl = imageU
&&&&&&&&this.text =
&&&&public&String getImageUrl() {
&&&&&&&&return&imageU
&&&&public&String getText() {
&&&&&&&&return&
现在,我们要实现一个ListAdapter,来显示ImageAndText列表。
public&class&ImageAndTextListAdapter extends&ArrayAdapter&ImageAndText& {
&&&&public&ImageAndTextListAdapter(Activity activity, List&ImageAndText& imageAndTexts) {
&&&&&&&&super(activity, 0, imageAndTexts);
&&&&@Override
&&&&public&View getView(int&position, View convertView, ViewGroup parent) {
&&&&&&&&Activity activity = (Activity) getContext();
&&&&&&&&LayoutInflater inflater = activity.getLayoutInflater();&
&&&&&&&&// Inflate the views from XML
&&&&&&&&View rowView = inflater.inflate(R.layout.image_and_text_row, null);
&&&&&&&&ImageAndText imageAndText = getItem(position);&
&&&&&&&&// Load the image and set it on the ImageView
&&&&&&&&ImageView imageView = (ImageView) rowView.findViewById(R.id.image);
&&&&&&&&imageView.setImageDrawable(loadImageFromUrl(imageAndText.getImageUrl()));&
&&&&&&&&// Set the text on the TextView
&&&&&&&&TextView textView = (TextView) rowView.findViewById(R.id.text);
&&&&&&&&textView.setText(imageAndText.getText());&
&&&&&&&&return&rowV
&&&&public&static&Drawable loadImageFromUrl(String url) {
&&&&&&&&InputStream inputS
&&&&&&&&try&{
&&&&&&&&&&&&inputStream = new&URL(url).openStream();
&&&&&&&&} catch&(IOException e) {
&&&&&&&&&&&&throw&new&RuntimeException(e);
&&&&&&&&return&Drawable.createFromStream(inputStream, "src");
这些View都是从&image_and_text_row.xml&XML文件中inflate的:
&?xml&version="1.0"&encoding="utf-8"?&&
&LinearLayout&xmlns:android=""
&&&&&&&&&&&&&&android:orientation="horizontal"
&&&&&&&&&&&&&&android:layout_width="fill_parent"
&&&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&ImageView&android:id="@+id/image"
&&&&&&&&&&&&&&&&&&&android:layout_width="wrap_content"
&&&&&&&&&&&&&&&&&&&android:layout_height="wrap_content"
&&&&&&&&&&&&&&&&&&&android:src="@drawable/default_image"/&&
&&&&&&&&&TextView&android:id="@+id/text"
&&&&&&&&&&&&&&&&&&android:layout_width="wrap_content"
&&&&&&&&&&&&&&&&&&android:layout_height="wrap_content"/&&
&/LinearLayout&
这个ListAdapter实现正如你所期望的那样,能在ListView中加载ImageAndText。但是,它唯一可用的场合是那些拥有很少 项目、无需滚动即可看到全部的列表。如果ImageAndText列表内容很多的时候,你会看到,滚动起来不是那么的平滑(事实上,远远不是)。&
上面例子最大的瓶颈是图片需要从internet上下载。因为我们的代码都在UI线程中执行,所以,每当一张图片从网络上下载时,UI就会变得停滞。如果你用3G网络代替WiFi的话,性能情况会变得更糟。
为了避免这种情况,我们想让图片的下载处于单独的线程里,这样就不会过多地占用UI线程。为了达到这一目的,我们可能需要使用为这种情况特意设计的 AsyncTask。实际情况中,你将注意到AsyncTask被限制在10个以内。这个数量是在Android SDK中硬编码的,所以我们无法改变。这对我们来说是一个制限事项,因为常常有超过10个图片同时在下载。
AsyncImageLoader
一个变通的做法是手动的为每个图片创建一个线程。另外,我们还应该使用Handler来将下载的图片invoke到UI线程。我们这样做的原因是我 们只能在UI线程中修改UI。我创建了一个AsyncImageLoader类,利用线程和Handler来负责图片的下载。此外,它还缓存了图片,防止 单个图片被下载多次。
public&class&AsyncImageLoader {&
&&&&private&HashMap&String, SoftReference&Drawable&& imageC&
&&&&public&AsyncImageLoader() {
&&&&&&&&imageCache = new&HashMap&String, SoftReference&Drawable&&();
&&&&public&Drawable loadDrawable(final&String imageUrl, final&ImageCallback imageCallback) {
&&&&&&&&if&(imageCache.containsKey(imageUrl)) {
&&&&&&&&&&&&SoftReference&Drawable& softReference = imageCache.get(imageUrl);
&&&&&&&&&&&&Drawable drawable = softReference.get();
&&&&&&&&&&&&if&(drawable != null) {
&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&}
&&&&&&&&final&Handler handler = new&Handler() {
&&&&&&&&&&&&@Override
&&&&&&&&&&&&public&void&handleMessage(Message message) {
&&&&&&&&&&&&&&&&imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
&&&&&&&&&&&&}
&&&&&&&&};
&&&&&&&&new&Thread() {
&&&&&&&&&&&&@Override
&&&&&&&&&&&&public&void&run() {
&&&&&&&&&&&&&&&&Drawable drawable = loadImageFromUrl(imageUrl);
&&&&&&&&&&&&&&&&imageCache.put(imageUrl, new&SoftReference&Drawable&(drawable));
&&&&&&&&&&&&&&&&Message message = handler.obtainMessage(0, drawable);
&&&&&&&&&&&&&&&&handler.sendMessage(message);
&&&&&&&&&&&&}
&&&&&&&&}.start();
&&&&&&&&return&
&&&&public&static&Drawable loadImageFromUrl(String url) {
&&&&&&&&// ...
&&&&}& && public&interface&ImageCallback {
&&&& public&void&imageLoaded(Drawable imageDrawable, String imageUrl);
注意:我使用了SoftReference来缓存图片,允许GC在需要的时候可以对缓存中的图片进行清理。它这样工作:&
&&&&&&&&&&调用loadDrawable(ImageUrl, imageCallback),传入一个匿名实现的ImageCallback接口
&&&&&&&&&&如果图片在缓存中不存在的话,图片将从单一的线程中下载并在下载结束时通过ImageCallback回调
&&&&&&&&&&如果图片确实存在于缓存中,就会马上返回,不会回调ImageCallback
在你的程序中,只能存在一个AsyncImageLoader实例,否则,缓存不能正常工作。在ImageAndTextListAdapter类中,我们可以这样替换:
ImageView imageView = (ImageView) rowView.findViewById(R.id.image);
imageView.setImageDrawable(loadImageFromUrl(imageAndText.getImageUrl()));
final&ImageView imageView = (ImageView) rowView.findViewById(R.id.image);
Drawable cachedImage = asyncImageLoader.loadDrawable(imageAndText.getImageUrl(), new&ImageCallback() {
&&&&public&void&imageLoaded(Drawable imageDrawable, String imageUrl) {
&&&&&&&&imageView.setImageDrawable(imageDrawable);
imageView.setImageDrawable(cachedImage);
使用这个方法,ListView执行得很好了,并且感觉滑动更平滑了,因为UI线程再也不会被图片加载所阻塞。&
更好的性能改善
如果你尝试了上面的解决方案,你将注意到ListView也不是100%的平滑,仍然会有些东西阻滞着它的平滑性。这里,还有两个地方可以进行改善:
&&&&&&&&&&findViewById()的昂贵调用
&&&&&&&&&&每次都inflate XML
因此,修改代码如下:
public&class&ImageAndTextListAdapter extends&ArrayAdapter&ImageAndText& {&&
&&&&private&ListView listV
&&&&private&AsyncImageLoader asyncImageL&
&&&&public&ImageAndTextListAdapter(Activity activity, List&ImageAndText& imageAndTexts, ListView listView) {
&&&&&&&&super(activity, 0, imageAndTexts);
&&&&&&&&this.listView = listV
&&&&&&&&asyncImageLoader = new&AsyncImageLoader();
&&&&@Override
&&&&public&View getView(int&position, View convertView, ViewGroup parent) {
&&&&&&&&Activity activity = (Activity) getContext();&
&&&&&&&&// Inflate the views from XML
&&&&&&&&View rowView = convertV
&&&&&&&&ViewCache viewC
&&&&&&&&if&(rowView == null) {
&&&&&&&&&&&&LayoutInflater inflater = activity.getLayoutInflater();
&&&&&&&&&&&&rowView = inflater.inflate(R.layout.image_and_text_row, null);
&&&&&&&&&&&&viewCache = new&ViewCache(rowView);
&&&&&&&&&&&&rowView.setTag(viewCache);
&&&&&&&&} else&{
&&&&&&&&&&&&viewCache = (ViewCache) rowView.getTag();
&&&&&&&&ImageAndText imageAndText = getItem(position);&
&&&&&&&&// Load the image and set it on the ImageView
&&&&&&&&String imageUrl = imageAndText.getImageUrl();
&&&&&&&&ImageView imageView = viewCache.getImageView();
&&&&&&&&imageView.setTag(imageUrl);
&&&&&&&&Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new&ImageCallback() {
&&&&&&&&&&&&public&void&imageLoaded(Drawable imageDrawable, String imageUrl) {
&&&&&&&&&&&&&&&&ImageView imageViewByTag = (ImageView) listView.findViewWithTag(imageUrl);
&&&&&&&&&&&&&&&&if&(imageViewByTag != null) {
&&&&&&&&&&&&&&&&&&&&imageViewByTag.setImageDrawable(imageDrawable);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&});
&&&&&&&&imageView.setImageDrawable(cachedImage);&
&&&&&&&&// Set the text on the TextView
&&&&&&&&TextView textView = viewCache.getTextView();
&&&&&&&&textView.setText(imageAndText.getText());&
&&&&&&&&return&rowV
这里有两点需要注意:第一点是drawable不再是加载完毕后直接设定到ImageView上。正确的ImageView是通过tag查找的,这 是因为我们现在重用了View,并且图片有可能出现在错误的行上。我们需要拥有一个ListView的引用来通过tag查找ImageView。&
另外一点是,实现中我们使用了一个叫ViewCache的对象。它这样定义:
public&class&ViewCache {&&
&&&&private&View baseV
&&&&private&TextView textV
&&&&private&ImageView imageV&
&&&&public&ViewCache(View baseView) {
&&&&&&&&this.baseView = baseV
&&&&public&TextView getTextView() {
&&&&&&&&if&(textView == null) {
&&&&&&&&&&&&textView = (TextView) baseView.findViewById(R.id.text);
&&&&&&&&return&titleV
&&&&public&ImageView getImageView() {
&&&&&&&&if&(imageView == null) {
&&&&&&&&&&&&imageView = (ImageView) baseView.findViewById(R.id.image);
&&&&&&&&return&imageV
有了ViewCache对象,我们就不需要使用findViewById()来多次查询View对象了。&
常用的ListView性能的方法:
&& & & & &1、在多线程异步加载图片
&& & & & &2、重用列表中行
&& & & & &3、缓存行中的View
Android应用开发之(onRetainNonConfigurationInstance和getLastNonConfigurationInstance)
很多开发者可能知道Android横竖屏切换时会触发 onSaveInstanceState,而还原时会产生onRestoreInstanceState,但是Android的Activity类还有一 个方法名为onRetainNonConfigurationInstance和getLastNonConfigurationInstance这两个 方法。
&& 我们可以通过& onRetainNonConfigurationInstance 代替 onSaveInstanceState
& @Override
& public Object onRetainNonConfigurationInstance()&
&&&&&& //这里需要保存的内容,在切换时不是bundle了,我们可以直接通过Object来代替
&在恢复窗口时,我们可以不使用 onRestoreInstanceState,而代替的是 getLastNonConfigurationInstance 方法。我们可以直接在onCreate中使用,比如Object&obj = getLastNonConfigurationInstance();&&&
最终obj的内容就是上次切换时的内容,每次Activity横竖屏切换时onCreate方法都会被触发。
Android应用开发之(你必须知道的ListView方法)
1. 更新ListView中的数据,通过调用BaseAdapter对象的notifyDataSetChanged()方法:
&&&&&&mAdapter.notifyDataSetChanged();
2. 每个listview都有无效的位置,如第一行的前一行,最后一行的后一行,这个无效的位置是一个常量.
&&&&&ListView.INVALID_POSITION
3.&有时我们需要在程序中通过点击按钮來控制ListView行的选中,这就用到了在程序中如何使用代码來选择ListView项.
&&&&&&&&&mListView.requestFocusFromTouch();
&&&&&&&& mListView.setSelection(int index);
&&&& 第一条语句并不是必须的,但是若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得 焦点优先极高的控件时,那么第一条语句是你必須加的.
4.& 同样的,若你ListView项中含有Button,RadioButton,CheckBox等比ListView取得 焦点优先级高的控件时,ListView的setOnItemClickListener是不被执行的,这时你需要在你的xml文件中对这些控件添加&&android:focusable="false"&注意这条语句要放在xml文件中修改,在代码中使用是无效的.
5. 如何保持ListView的滚动条一直显示,不隐藏呢:& xml文件中做如下修改&&&&android:fadeScrollbars="false"
6. ListView本身有自己的按键事件,即你不需要设置方向键的标识,按下方向鍵ListView就會有默认的动作,那如何进行控制,编写自己的onKey呢,你需要在Activity中重写dispatchKeyEvent(KeyEvent event);方法,在这里面定义你自己的动作就可以了
Android应用开发之(你必须知道的View中方法 )
onFinishInflate() 当View中所有的子控件 均被映射成xml后触发
onMeasure(int, int) 确定所有子元素的大小
onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发
onSizeChanged(int, int, int, int) 当view的大小发生变化时触发
onDraw(Canvas) view渲染内容的细节
onKeyDown(int, KeyEvent) 有按键按下后触发
onKeyUp(int, KeyEvent) 有按键按下后弹起时触发
onTrackballEvent(MotionEvent) 轨迹球事件
onTouchEvent(MotionEvent) 触屏事件
onFocusChanged(boolean, int, Rect) 当View获取 或失去焦点时触发&
onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发
onAttachedToWindow() 当view被附着到一个窗口时触发
onDetachedFromWindow() 当view离开附着的窗口时触发,该方法和&&onAttachedToWindow() 是相反的。
onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发
Android Linkify添加超链接
之前使用Java开发桌面应用的时候,在JTextPane中添加超链接并且设置监听是个很麻烦的事情,最终我也没找到一个很好的方法。用来开发android就爽了,API封装的不错,添加个超链接变的非常简单。
首先,在TextView所属xml配置文件中,直接添加android:autoLink特性即可,它支持一个或多个(用分割)自定义的值:none、web、email、phone或all。
另外,你还可以用Linkify来添加超链接,下面介绍一下这个类:
Linkify是一个辅助类,通过RegEx样式匹配,自动地在TextView类(和继承的类)中创建超链接。
符合特定的RegEx样式的文本会被转变成可点击的超链接,这些超链接隐式地调用startActivity(new Intent(Intent.ACTION_VIEW, uri)),符合的文本会作为目标URI。
你可以指定任意的字符串样式为链接;方便地,Linkify类提供了预置的通用内容类型(如电话号码和e-mail、web地址)。
Linkify.addLinks静态方法接受一个View来制作链接,还包括一个或多个支持的默认内容类型的位结果。Linkify类提供了一些内容类型:WEB_URLS、EMAIL_ADDRESSES、PHONE_NUMBERS和ALL.
接下来的代码片段显示如何为TextView制作链接显示web和e-mail地址为超链接。当点击时,它们会相应地打开浏览器或e-mail应用程序。
TextView textView = (TextView)findViewById(R.id.myTextView);
Linkify.addLinks(textView, Linkify.WEB_URLSLinkify.EMAIL_ADDRESSES);
可是有时候我们需要自定义一些超链接,像新浪微博中的@和#,这时候怎么办呢?
为了定义自己的链接字符串,你需要创建一个RegEx样式来匹配文本,进而显示成超链接。和本地类型一样,通过调用 Linkify.addLinks来指定目标View,但这次,传入的是的RegEx样式。你还可以传入一个前缀,当链接点击时,它会添加到目标URI 上。例如:
int&flags&=&Pattern.CASE_INSENSITIVE;
Pattern p&=&pile(&\\bquake[-9]*\\b&, flags);
Linkify.addLinks(myTextView, p, &content://com.paad.earthquake/earthquakes/&);
Android应用开发之(Gallery默认居左解决方案)
Android 中的Gallery控件默认会将第一项居中显示,在某些场景会影响用户体验,分享一下居左的解决方案:
* Align the first gallery item to the left.
* @param parentView The view containing the gallery widget (we assume the gallery width
* is set to match_parent)
* @param gallery The gallery we have to change
private void alignGalleryToLeft(View parentView, Gallery gallery) {
int galleryWidth = parentView.getWidth();
// We are taking the item widths and spacing from a dimension resource because:
// 1. No way to get spacing at runtime (no accessor in the Gallery class)
// 2. There might not yet be any item view created when we are calling this
// function
int itemWidth = context.getResources()
.getDimensionPixelSize(R.dimen.gallery_item_width);
int spacing = context.getResources()
.getDimensionPixelSize(R.dimen.gallery_spacing);
// The offset is how much we will pull the gallery to the left in order to simulate
// left alignment of the first item
if (galleryWidth &= itemWidth) {
offset = galleryWidth / 2 - itemWidth / 2 -
offset = galleryWidth - itemWidth - 2 *
offset = 0;
// Now update the layout parameters of the gallery in order to set the left margin
MarginLayoutParams mlp = (MarginLayoutParams) gallery.getLayoutParams();
mlp.setMargins(-offset, mlp.topMargin, mlp.rightMargin, mlp.bottomMargin);
Android应用开发之(你必须知道的android selector下的属性值)
在res/drawable文件夹新增一个文件,此文件设置了图片的触 发状态,你可以设置 state_pressed,state_checked,state_pressed,state_selected,state_focused,state_enabled 等几个状态:
android:state_pressed
Boolean. "true" if this item should be used when the object is pressed (such as when a button is touched/clicked); "false" if this item should be used in the default, non-pressed state.
如果是true,当被点击时显示该图片,如果是false没被按下时显示默认。
android:state_focused
Boolean. "true" if this item should be used when the object is focused (such as when a button is highlighted using the trackball/d-pad); "false" if this item should be used in the default, non-focused state.
true,获得焦点时显示;false,没获得焦点显示默认。
android:state_selected
Boolean. "true" if this item should be used when the object is selected (such as when a tab is opened); "false" if this item should be used when the object is not selected.
true,当被选择时显示该图片;false,当未被选择时显示该图片。
android:state_checkable
Boolean. "true" if this item should be used when the "false" if this item should be used when the object is not checkable. (Only useful if the object can transition between a checkable and non-checkable widget.)
true,当CheckBox能使用时显示该图片;false,当CheckBox不能使用时显示该图片。
android:state_checked
Boolean. "true" if this item should be used when t "false" if it should be used when the object is un-checked.
true,当CheckBox选中时显示该图片;false,当CheckBox为选中时显示该图片。
android:state_enabled
Boolean. "true" if this item should be used when the object is enabled (capable of receiving touch/click events); "false" if it should be used when the object is disabled.
true,当该组件能使用时显示该图片;false,当该组件不能使用时显示该图片。
android:state_window_focused
Boolean. "true" if this item should be used when the application window has focus (the application is in the foreground), "false" if this item should be used when the application window does not have focus (for example, if the notification shade is pulled down or a dialog appears).
true,当此activity获得焦点在最前面时显示该图片;false,当没在最前面时显示该图片。
&?xml version="1.0"&encoding="utf-8"?&&selector&xmlns:android="/apk/res/android"&& &&&item&android:state_pressed="true"& & & & &&android:drawable="@drawable/button_pressed"/&&!-- pressed --&& &&&item&android:state_focused="true"& & & & &&android:drawable="@drawable/button_focused"/&&!-- focused --&& &&&item&android:drawable="@drawable/button_normal"/&&!-- default --&&/selector&
Android图片Exif处理方法
一.什么是Exif
Exif(Exchangeable Image File 可交换图像文件)是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍 摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图 等。简单地说,Exif=JPEG+拍摄参数。因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能 处理 Exif信息。
所有的JPEG文件以字符串&0xFFD8&开头,并以字符串&0xFFD9&结束。文件头中有一系列 &0xFF??&格式的字符串,称为&标识&,用来标记JPEG文件的信息段。&0xFFD8&表示图像信息开始,&0xFFD9&表示图像信息结束,这 两个标识后面没有信息,而其它标识紧跟一些信息字符。
0xFFE0 -- 0xFFEF之间的标识符称为&应用标记&,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全 球定位信息。按照Exif2.1标准对这些标识符的定义,数码相机可以把各种拍摄信息记入数码图像中,应用软件可以读取这些数据,再按照Exif2.1标 准,检索出它们的具体含义,一般而言包括以下一些信息:
Image Description 图像描述、来源. 指生成图像的工具
Artist作者 有些相机可以输入使用者的名字
Make 生产者 指产品生产厂家
Model 型号 指设备型号
Orientation方向 有的相机支持,有的不支持
XResolution/YResolution X/Y方向分辨率 本栏目已有专门条目解释此问题。
ResolutionUnit分辨率单位 一般为PPI
Software软件 显示固件Firmware版本
DateTime日期和时间
YCbCrPositioning 色相定位
ExifOffsetExif信息位置,定义Exif在信息在文件中的写入,有些软件不显示。
ExposureTime 曝光时间 即快门速度
FNumber光圈系数
ExposureProgram曝光程序 指程序式自动曝光的设置,各相机不同,可能是Sutter Priority(快门优先)、Aperture Priority(快门优先)等等。
ISO speed ratings感光度
ExifVersionExif版本
DateTimeOriginal创建时间
DateTimeDigitized数字化时间
ComponentsConfiguration图像构造(多指色彩组合方案)
CompressedBitsPerPixel(BPP)压缩时每像素色彩位 指压缩程度
ExposureBiasValue曝光补偿。
MaxApertureValue最大光圈
MeteringMode测光方式, 平均式测光、中央重点测光、点测光等。
Lightsource光源 指白平衡设置
Flash是否使用闪光灯。
FocalLength焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距 MakerNote(User Comment)作者标记、说明、记录
FlashPixVersionFlashPix版本 (个别机型支持)
ColorSpace色域、色彩空间
ExifImageWidth(Pixel X Dimension)图像宽度 指横向像素数
ExifImageLength(Pixel Y Dimension)图像高度 指纵向像素数
Interoperability IFD通用性扩展项定义指针 和TIFF文件相关,具体含义不详
FileSource源文件 Compression压缩比。&
二.Android 中Exif处理方案
在Android Camera&对于Exif的写操作是交给Camera硬件抽象层去完成,应用程序一般只进行读取操作,但如果对拍摄后的图片进行处理就会丢失相关的Exif信息,因此我们需要将exif信息写入到处理后的图片中,
方法如下:
通过&ExifInterface sourceExif = new&ExifInterface(sourceImagePath);
&mDateTime= sourceExif.getAttribute(ExifInterface.TAG_DATETIME);
获取拍摄时间属性值
ExifInterface exif =&newExifInterface(targetImagePath);
exif.setAttribute(ExifInterface.TAG_DATETIME, mDateTime);
& & exif.saveAttributes();
}&catch(IOException e) {
& &&e.printStackTrace();
将相关拍摄时间参数写入到处理后的图片中
这样,我们就可以处理了Exif信息了,同时还可以修改相关参数即使出现异常,应用能够自动修正。这里只是以Exif中的TAG_DATETIME参数为例,其他参数可以以此类推,请参数api文档。
Android应用开发之(JSON解析库的选择)
&&&&&& JSON(JavaScript Object Notation)&是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。&JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
& & & &Android的SDK中包含四个与JSON相关的类和一个Exceptions:JSONArray、JSONObject、JSONStringer、JSONTokener、JSONException。 通过这5个类我们就可以自行对Json进行解析(使用很简单,可以网上搜索使用方法或者参照Android SDK),另外Google在Android的SDK中放入了JsonReader和JsonWriter来方便我们读写Json。但是通过他们读写 Json还都要停留到手工操作上,无法直接实现Json字符串到对象、对象到Json字符串的转换,例如解析Json需要通过Key值一个一个的取 Value,工作量大不说,还增加了出错的几率。有没有办法可以:直接实现Json字符串到对象、对象到Json字符串的转换?
& & & &在Java EE中使用最广泛的是Jackson Json(据说是集成到Spring中的,我不太清楚),使用非常方便而且效率极高;另外还有两个比较有名气的是Gson和JSON-lib,某些大侠已 经对它们做了对比实验,结论如下执行效率:Jackson&Gson&JSON-lib,但是鉴于我们要将解析库集成到Android应用当 中,我们还要考虑一下嵌入的库的体积,分别取他们的最新版本:
jackson-all-1.9.0.jar & & & & 1.1MB
gson-1.7.1.jar& & & & & & & & &174KB
json-lib-2.4-jdk15.jar & & &159KB & &(2010年12月开始已经停止更新了)
& & & &通过这个比较我们几乎可以直接排除掉jackson(为了解析JSON方便而让软件增加1.1MB?),而json lib执行效率低下且已经停止了更新,我们也不希望选用。另外jackson生于Jave EE,完全符合java bean惯例是对getter进行序列化,而gson是对成员变量field进行序列化,Android恰恰是推荐开发者直接使用成员变量访问而不是用 setter、getter。最终我们选择了Google出品的Gson,至于Gson如何使用,欢迎关注下一篇文章。
Android应用开发之(Gson的使用)
我们选择好了把Gson作为我们的JSON解析库,如何应用到我们的程序中呢?之需要引入Gson的jar包即可:
下载地址:/p/google-gson/&
Code Docs:http://google-/svn/trunk/gson/docs/javadocs/index.html&
使用方法:&
一、对象--&JSON&
& &假如我们有一个类Person:&
public class&Person {
& & public long&
& & public&S
& &&public boolean isM
& & public&S
& &通过一个Gson实例:&
Gson gson = new&Gson();
& &我们可以直接将一个Person实例转换成Json字符串:&
Person person = new&Person();
person.id= 111;
person.name= "张三";
person.isMale=
person.avatar= "http://aaaaaaaaa";
String jsonStr = gson.toJson(person);
Log.v("=============", jsonStr);
& &即使是List和Map也可以(以List为例):&
ArrayList&Person& list = new&ArrayList&Person&();
Person person =&new&Person();
person.id= 111;
person.name=&"张三";
person.isMale=
person.avatar=&"http://aaaaaaaaa";
list.add(person);
person =&new&Person();
person.id= 222;
person.name=&"李四";
person.isMale=
person.avatar=&"http://bbbbbbbbb";
list.add(person);
String jsonStr = gson.toJson(list);
Log.v("=============", list);
二、JSON--&对象&
& &反过来如何解序列化呢(也就是解析JSON)?&
& &还是先以Person对象为例:&
private final String JSON_STR = "{\"avatar\":\"http://aaaaaaaaa\",\"name\":\"博张三\",\"id\":111,\"isMale\":true}";
Person person = gson.fromJson(JSON_STR, Person.class);
& 没错,就是如此简单,如果是List或者Map也同样简单(同样以List为例):&
private&final&String JSON_STR= " [{\"avatar\":\"http://aaaaaaaaa\",\"name\":\"张三\",\"id\":111,\"isMale \":true},{\"avatar\":\"http://bbbbbbbbb\",\"name\":\"李四\",\"id\":222, \"isMale\":false}]";
ArrayList&Person& list =&new&ArrayList&Person&();
Type listType = newTypeToken&List&Person&&(){}.getType();
list = gson.fromJson(JSON_STR, listType);
八个Android开源游戏引擎
Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL ES技术开发。该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷在于文档不足,而且下载的代码中仅仅包含有少量的示例教程。&
最低运行环境要求不详。&
项目地址:/p/angle/&
rokon 是一款Android 2D游戏引擎,基于OpenGL ES技术开发,物理引擎为Box2D,因此能够实现一些较为复杂的物理效果,该项目最新版本为 2.0.3 (09/07/10)。总体来说,此引擎最大的优点在于其开发文档相当之完备,并且项目作者对反馈Bug的修正非常之神速,所以该框架的使用在目前也最为 广泛,有人干脆将它称为Cocos2d-iPhone引擎的Android版(业务逻辑和编码风格上也确实很像)。附带一提,国内某个需要注册会员才能下 载的Android游戏框架衍生于此框架,所以大家也不要刻板的认为收费便一定是好的,免费就一定不好。&
最低运行环境要求为Android 1.5。&
项目地址:/p/rokon/&
LGame 是一款国人开发的Java游戏引擎,有Android及PC(J2SE)两个开发版本,目前最高版本同为0.2.6(31/07/10)。其底 层绘图器LGrpaphics封装有J2SE以及J2ME提供的全部Graphics API(PC版采用Graphics2D封装,Android版采用Canvas模拟实现),所以能够将J2SE或J2ME开发经验直接套用其中,两版本 间主要代码能够相互移植。Android版内置有Admob接口,可以不必配置XML直接硬编码Admob广告信息。&
该 引擎除了基本的音效、图形、物理、精灵等常用组件以外,也内置有Ioc、xml、http等常用Java组件的封装,代价是jar体积较为庞大,PC版 已突破1.2MB,Android版有所简化也在500KB左右。此外,该引擎还内置有按照1:1实现的J2ME精灵类及相关组件,可以将绝大多数 J2ME游戏平移到Android或PC版中。唯一遗憾的是,该项目作者是个极其懒惰的家伙,开发文档从去年说到今年依旧没有提供,只有游戏示例可供下 载。&
最低运行环境要求为Android 1.1。&
项目地址:/p/loon-simple/&
4、AndEngine&
andengine同样是一款基于OpenGL ES技术的Android游戏引擎,物理引擎同样为Box2D(标配|||)。该框架性能普通,文档缺乏,但示例较为丰富。&
下载地址(未直接提供jar下载,源码可通过svn提取):/p/andengine/&
最低运行环境要求不详。&
项目地址:/p/rokon/&
5、libgdx&
libgdx 是一款基于OpenGL ES技术开发的Android游戏引擎,支持Android平台下的2D游戏开发,物理引擎采用Box2D实现。单就性能角度来说,堪称是一款非常强大的 Android游戏引擎,但缺陷在于精灵类等相关组件在使用上不够简化,而且文档也较为匮乏。&
最低运行环境要求不详。&
项目地址:/p/libgdx/&
jPCT 是一款基于OpenGL技术开发的3D图形引擎(PC环境为标准OpenGL,Android为OpenGL ES), 以Java语言为基础的,拥有功能强大的Java 3D解决方案。该引擎与LGame(此为2D游戏引擎)相类似,目前拥有PC(J2SE)以及Android两个开发版本。&
jPCT 的最大优势之一,就在于它惊人的向下兼容性。在PC环境中,jPCT甚至可以运行在JVM1.1环境之中,因为jPCT内部提供的图形渲染接口完 全符合所有的Java 1.1规范(就连已经消失的Microsoft VM乃至更古老的Netscape 4 VM也不例外)。&
最低运行环境要求为Android 1.5。&
项目地址:http://www.jpct.net/jpct-ae/&
7、Alien3d&
Alien3d 是一款体积非常之小的Android 3D游戏引擎,基于OpenGL ES技术开发。为了压缩体积,它根据不同功能采用多jar方式发布(包括alien3d-engine.jar,alien3d- tiled.jar,alien3d-sprites.jar,alien3d-shapes.jar,alien3d- particles2d.jar,),事实上它的核心文件大约只有40KB,所有相关jar的总和也不足150KB。&
最低运行环境要求为Android 1.5。&
项目地址:/p/alien3d/&
8、Catcake&
Catcake是一款跨平台的Java 3D图形引擎,目前支持PC(J2SE)及Android环境运行(已有iPhone版规划)。该引擎在易用性和运行性能上皆有出色的表现,支持常见的游戏开发功能,诸如精灵动画,音频处理和视频播放等。&
最低运行环境要求为Android 1.6。&
项目地址:/p/catcake/
Android应用开发之(你必须知道的“文件上传时显示进度的解决方案”)
进行大文件上传时,显示上传进度是很好的用户体验,可以有效的缓解用户急躁的情绪。今天Android IT 分享一个好的显示上传进度的解决方案。&
我们用到以下两个类就可实现带进度条的文件上传:
1、CustomMultiPartEntity&extends&MultipartEntity,&
2、HttpMultipartPost extends&AsyncTask
代码如下:
import java.io.FilterOutputS
import java.io.IOE
import java.io.OutputS
import java.nio.charset.C
import org.apache.http.entity.mime.HttpMultipartM
import org.apache.http.entity.mime.MultipartE&
public class CustomMultipartEntity extends MultipartEntity {
& & private final ProgressL
& & public CustomMultipartEntity(final ProgressListener listener) {
& & & & super();
& & & & this.listener =
& & public CustomMultipartEntity(final HttpMultipartMode mode, final ProgressListener listener) & & {
& & & & super(mode);
& & & & this.listener =
& & public CustomMultipartEntity(HttpMultipartMode mode, final String boundary,
& & & & & & final Charset charset, final ProgressListener listener) {
& & & & super(mode, boundary, charset);
& & & & this.listener =
& & @Override
& & public void writeTo(final OutputStream outstream) throws IOException {
& & & & super.writeTo(new CountingOutputStream(outstream, this.listener));
& & public static interface ProgressListener {
& & & & void transferred(long num);
& & public static class CountingOutputStream extends FilterOutputStream {
& & & & private final ProgressL
& & & & priv
& & & & public CountingOutputStream(final OutputStream out, final ProgressListener listener) {
& & & & & & super(out);
& & & & & & this.listener =
& & & & & & this.transferred = 0;
& & & & public void write(byte[] b, int off, int len) throws IOException {
& & & & & & out.write(b, off, len);
& & & & & & this.transferred +=
& & & & & & this.listener.transferred(this.transferred);
& & & & public void write(int b) throws IOException {
& & & & & & out.write(b);
& & & & & & this.transferred++;
& & & & & & this.listener.transferred(this.transferred);
该类计算写入的字节数,我们需要在实现ProgressListener中的trasnfered()方法,更行进度条&
public &class&HttpMultipartPost&extends&AsyncTask&HttpResponse, Integer, TypeUploadImage& {&
& & ProgressD&
& & longtotalS&
& & @Override
& & protectedvoidonPreExecute(){
& & & & pd= newProgressDialog(this);
& & & & pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
& & & & pd.setMessage("Uploading Picture...");
& & & & pd.setCancelable(false);
& & & & pd.show();
& & @Override
& & protectedTypeUploadImagedoInBackground(HttpResponse... arg0) {
& & & & HttpClienthttpClient = newDefaultHttpClient();
& & & & HttpContexthttpContext = newBasicHttpContext();
& & & & HttpPosthttpPost = newHttpPost("/UploadImage.php");&
& & & & try{
& & & & & & CustomMultipartEntitymultipartContent = newCustomMultipartEntity(
& & & & & & & & & & newProgressListener() {&
& & & & & & & & & & & & @Override
& & & & & & & & & & & & public&void&transferred(longnum){
& & & & & & & & & & & & & & publishProgress((int) ((num / (float) totalSize) * 100));
& & & & & & & & & & & & }
& & & & & & & & & & });&
& & & & & & // We use FileBody to transfer an image
& & & & & & multipartContent.addPart("uploaded_file", newFileBody(
& & & & & & & & & & newFile(m_userSelectedImagePath)));
& & & & & & totalSize= multipartContent.getContentLength();&
& & & & & & // Send it
& & & & & & httpPost.setEntity(multipartContent);
& & & & & & HttpResponseresponse = httpClient.execute(httpPost, httpContext);
& & & & & & String serverResponse = EntityUtils.toString(response.getEntity());&
& & & & & & ResponseFactoryrp = newResponseFactory(serverResponse);
& & & & & & return(TypeImage) rp.getData();
& & & & }&
& & & & catch(Exception e) {
& & & & & & System.out.println(e);
& & @Override
& & protectedvoidonProgressUpdate(Integer... progress){
& & & & pd.setProgress((int) (progress[0]));
& & @Override
& & protectedvoidonPostExecute(TypeUploadImageui) {
& & & & pd.dismiss();
在&transferred()函数中调用publishProgress((int) ((num / (float)&totalSize) * 100));
在onProgressUpdate()实现上传进度的更新操作
分享一些Android开源项目链接,有兴趣的朋友可以研究下
Android PDF 阅读器&
个人记账工具 OnMyMeans&
Android电池监控 Android Battery Dog&
RSS阅读软件 Android RSS&
Android的PDF阅读器 DroidReader&
Android Scripting Environment&/p/android-scripting/
Android小游戏 Android Shapes&
Android JSON RPC&
Android VNC&
魅族M8的Android移植 M8 Android&
Android 游戏 Amazed&
Android的社交网络 HelloWorld goes mobile&
手机聊天程序 Android jChat&
Android的GPS轨迹记录 MyTracks&
Android国际象棋游戏 Honzovy achy&
Android旅行记录软件 AndTripLog&
音乐播放器 Ambient&
Android的邮件客户端 K9mail&
多平台应用开发库 QuickConnect&
gPhone手机空战游戏&
Android 照片小软件 Panoramio&
Android 小游戏 DivideAndConquer&
Android 全球时间 AndroidGlobalTime&
Android 2D游戏引擎 Android Angle&
Android Ruby&
Android-N810&
Android的短信应用 Ecclesia&
Android平台上的JXTA客户端 Peerdroid&
Android游戏引擎 libgdx&
Android 照片小软件 Photostream&
Alien3d logo Android 3D游戏引擎 Alien3d&
Winamp Remote Android Server&
Android的Facebook客户端 Andrico&
Android Applications Manager&
Java 3D图形引擎 Catcake&
android-gcc-objc2-0&
九宫格数独游戏 OpenSudoku&
Android 铃声扩展工具 RingsExtended&
JavaEye Android client&
RemoteDroid&
Android 小游戏 Clickin2DaBeat&
中医大夫助理信息系统 zz-doctor&
Facebook Connect for Android&
Android SMSPopup&
FreeTTS-Android&
的客户端 Foursquar&
条形码扫描仪 Android PC_BCR&&&&
站长在关注}

我要回帖

更多关于 肚子右面疼 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信