android 链接mysql数据库

android下可以连接远程数据的,不过你远程的数据库服务的要开启远程,具体设置[http://www.ways2u.com/knowledge/?post=142](http://www.ways2u.com/knowledge/?post=142) Java利用JDBC访问数据库的编程步骤 http://www.ways2u.com/?post=76 android 链接mysql数据库实例: package com.hl; import java.sql.DriverManager; import java.sql.ResultSet; import com.mysql.jdbc.Connection; import com.mysql.jdbc.Statement; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class AndroidMsql extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn=(Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { sqlCon(); } }); } private void mSetText(String str){ TextView txt=(TextView)findViewById(R.id.txt); txt.setText(str); } ...

2015年1月6日 · 1 分钟 · 天边的星星

10大优秀的移动Web应用程序开发框架推荐

在最近几年里,移动互联网高速发展、市场潜力巨大。继计算机、互联网之后,移动互联网正掀起第三次信息技术革命的浪潮,新技术、新应用不断涌现。今天这篇文章向大家推荐10大优秀的移动Web开发框架,帮助开发者更加高效的开发移动Web应用。 Sencha Touch Framework Sencha Touch 是世界上第一个基于 HTML5 的移动 Web 开发框架,支持最新的 HTML5 和 CSS3 标准,全面兼容 Android 和 Apple iOS 设备,提供了丰富的 WEB UI 组件,可以快速的开发出运行于移动终端的应用程序。 jQuery Mobile jQuery Mobile 框架把“write less, do more”精神提升到更高的层次。jQuery 移动框架可以帮助你设计一个可运行于所有流行智能手机和平板平台的应用程序,而不需要为每种移动终端都开发一个特别的版本。 jQTouch jQTouch 是一款 jQuery 的插件,用于手机上实现动画、列表导航、默认应用样式等各种常见UI效果。支持 iPhone、Android 等手机。 The M Project The-M-Project 是一个包含各种UI组件,基于 jQuery 开发 HTML5 应用程序的移动Web应用框架,支持 iOS、Android、Palm webOS和BlackBerry 等平台。 DHTMLX Touch – HTML5 JavaScript Framework for Mobile DHTMLX Touch 是一个基于 HTML5 的免费 JavaScript 库,用于构建跨平台的移动 Web 应用程序。这不只是一组UI部件,而是一个完整的框架,它允许你为手机等触摸设备创建强大的Web应用程序。 WebApp.Net WebApp.Net 提供了很多的 API,因此可以帮助你节省很多工作了。不需要花时间去进行 Ajax 调用的编码,因为已经内置了,另外还有很多其它内置功能,提供了详细的文档和应用演示。 ...

2015年1月2日 · 1 分钟 · 天边的星星

Android 图片的内存优化

在Android应用中,当对图片本身进行操作时,应该尽量不要是使用setImageBitmap、setImageResource、BitmapFactory.decodeResource来设置一张大图,因为这些方法在完成Decode后,最终都是通过java层的createBitmap()方法来完成的,这需要消耗更多的内存。因此,应该先通过BitmapFractory.decodeStream方法创建出一个bitmap,然后再将其设置为imageview的source。decodeStream最大的优点是直接调用JNI–>nativeDecodeAsset()来完成decode,而不需要在使用java层的createBitmap,从而节省了java层的空间。如果在读取图片是加上图片的Config参数,可以更有效的减少加载的内存,从而更有效的阻止抛出内存溢出。另外decodeStream直接用图片来读取字节码,不会根据机器的各种分辨率来自动适应。当使用了decodeStream后,需要在hdpi和mdpi中配置相应的图片资源,否则在不同分辨率的机子上都是同样大小(像素点数量),显示出来的大小就不对了。 优化Dalvik虚拟机的堆内存分配。对Android平台来说,其托管层使用的时Dalvik Java VM,从目前的表现来看还有很多地方可以优化处理,比如在开发一些大型游戏或者耗资源的应用中可以考虑用手动干预GC处理,使用类dalvik.system.VMRuntime提供的setTargetHeapUtilization可以增强程序堆内存的处理效率。使用方法如下: private final static float TARGET_HEAP_UTILIZATION=0.75f; VMRuntime.getRuntime().setTargetHeapUtilazation(TARGET_HEAP_UTILIZATION); 另外还可以用如下方法定义堆内存的大小,这样就实现了优化功能。 private final static int CWJ_HEAP_SIZE=6*1024*1024; VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);//设置Heap的最小内存6M。

2015年1月2日 · 1 分钟 · 天边的星星

Android内存泄露相关知识总结

在开发应用过程中,我们可以使用现成的工具来查看内存泄漏的情况。例如DDMS和MAT,MAT是Memory Analyzer Tool的缩写,MAT可以安装eclipse插件(更新地址http://download.eclipse.org/mat/1.4/update-site/),可以使用比插件方便的RCP(下载地址:http://www.eclipse.org/mat/downloads.php)。对于MAT的使用我们暂时不详细讲解,小伙伴们可以去(http://www.eclipse.org/mat/中查看Documentation中查看,里面还有blog可以看) 。 查看内容泄漏的方法步骤: 1.生成.hprof文件(使用DDMS生成,有必要的话,我给小伙伴录制一个视频讲解教程) 2.使用MAT导入.hprof文件 3.使用MAT的视图工具分析内存 备注:由于有文件保存,肯定会用到SD卡,用模拟器的小伙伴不要忘记创建SD卡和让测试应用有读写SD卡的权限。如果真的没有SD卡,小伙伴可以使用android.os.Debug中的方法手动指定.hprof的内存(不是运行时内存,指的是系统的内存存储)位置,例如 xxxButton.setOnclickListener(new View.OnClickListener(){ android.os.Debug.dumpHprofData(“/data/tem/XXX.hprof”);//文件路径可以是SD卡路径 });如果使用android.os.Debug.dumpHprofData()方法手动生成的.hprof文件,需要使用Android/Tools/ hprofconv xxx.hprof yyy.hprof把原来的xxx.hprof转换成yyy.hprof文件(这个文件才是MAT分析的文件)。 目前查看内存分析查找内存泄漏的方法还有以下几种 1.使用命令查看某个进程的内存。例如创建一个脚本文件xxx.sh.该文件的内容指定程序1秒钟输出某个进程的内存使用情况 代码如下 #!/bin/bash While true; do adb shell procrank | grep “进程名称” Sleep 1 done 2.使用Top命令查看内存 Adb shell top -m 10//查看使用资源最多的10个进程 Adb shell top|grep 进程名称 //查看指定进程的内存 3. free命令 Free命令用来显示内存使用情况,使用权限是所有用户。格式如下 Free [-b|-k|-m] [-o] [-s delay] [-t] [-v] 参数 -b/-k/-m表示以B、KB、MB为单位显示内存使用情况 参数 -s delay 显示每隔多少秒数来显示一次内存使用情况 参数 -t 显示内存总和列 参数 -o 不显示缓冲区调节列 Android 为应用进程分配的内存上限保存在ANDROID_SOURCE/system/core/rootdir/init.rc脚本中。

2014年12月19日 · 1 分钟 · 天边的星星

android获取Mac地址和IP地址

获取Mac地址实际项目中测试了如下几种方法: (1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) ``` //根据Wifi信息获取本地Mac public static String getLocalMacAddressFromWifiInfo(Context context){ WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); return info.getMacAddress(); } ``` (2)调用Linux的busybox,通过linux命令来获取 [![复制代码](http://common.cnblogs.com/images/copycode.gif)](http://www.cnblogs.com/lijunamneg/archive/2013/03/04/2943146.html) //根据busybox获取本地Mac public static String getLocalMacAddressFromBusybox(){ String result = ""; String Mac = ""; result = callCmd("busybox ifconfig","HWaddr"); //如果返回的result == null,则说明网络不可取 if(result==null){ return "网络出错,请检查网络"; } //对该行数据进行解析 //例如:eth0 Link encap:Ethernet HWaddr 00:16:E8:3E:DF:67 if(result.length()>0 && result.contains("HWaddr")==true){ Mac = result.substring(result.indexOf("HWaddr")+6, result.length()-1); Log.i("test","Mac:"+Mac+" Mac.length: "+Mac.length()); /*if(Mac.length()>1){ Mac = Mac.replaceAll(" ", ""); result = ""; String[] tmp = Mac.split(":"); for(int i = 0;i<tmp.length;++i){ result +=tmp[i]; } }*/ result = Mac; Log.i("test",result+" result.length: "+result.length()); } return result; } private static String callCmd(String cmd,String filter) { String result = ""; String line = ""; try { Process proc = Runtime.getRuntime().exec(cmd); InputStreamReader is = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader (is); //执行命令cmd,只取结果中含有filter的这一行 while ((line = br.readLine ()) != null && line.contains(filter)== false) { //result += line; Log.i("test","line: "+line); } result = line; Log.i("test","result: "+result); } catch(Exception e) { e.printStackTrace(); } return result; } [![复制代码](http://common.cnblogs.com/images/copycode.gif)](http://www.cnblogs.com/lijunamneg/archive/2013/03/04/2943146.html) (3)调用android 的API: NetworkInterface. getHardwareAddress () 该API的level为9,只有android 2.3以上才有该接口 ...

2014年12月18日 · 3 分钟 · 天边的星星

Android Studio 简单介绍和使用问题小结

随着android 5.0 的发布,android 开发已经进入了一个全新的时代,eclipse开发安卓已经有点不合时宜了,在github上80%的android项目都采用android studio开发,而且android studio的中文教程越来越多,还有什么理由不固守这eclipse 呢。 下面这篇文章对了解android studio 很有帮助,原文如下: Google在2013的I/O开发者大会上引入的该开发工具。现在已经更新到了0.5.8版本。 现在github的很多项目都使用了Android Studio开发,所以如果你还用Eclipse,就需要把整个项目拆分, 然后在工程中include依赖包,是非常费事的,有时候弄了半天还不一定能成功导入。而且Android开发者工具的未来的趋势一定也是转向Android Studio。 介于种种原因,不得不学习使用Android Studio,Android Studio的项目管理使用了Gradle,所以你需要对Gradle进行简单的理解,可以到官网去看下。 Gradle官网 http://www.gradle.org 因为Android 是在IntelliJ IDEA的基础上开发的,所以可以参考 IntelliJ IDEA 的官方帮助地址 http://www.jetbrains.com/idea/webhelp/getting-help.html 简单引入一些概念:(有些是来自个人的官方翻译有些是copy过来的) ** ** Android Studio 建立系统工具包你用来生成,测试,运行您的应用程序和软件包。构建系统是独立于Android的工作室,所以你可以调用它的Android的工作室或从命令行。在你写你的应用程序,你可以使用编译系统的特点: 定制,配置,和扩展的建立过程。 为您的应用程序使用同一项目的不同特点,创建多个应用程序。 重用代码和资源。 AndroidStudio构建系统由Gradle构成。Gradle是一种高级的构建工具,用于管理依赖性,允许你定义自定义构建逻辑。 Android插件工具并不依赖于Android Studio,虽然Android Studio由它完全集成。 Gradle的配置包含以下方面 构建变量 构建系统可以根据不同的配置为同一个项目生成多个APK。当你想建立不同版本的应用程序,而不必为每个人单独的项目,这是很有用的。 依赖关系 构建系统管理项目的依赖,并从本地文件系统和远程存储库支持的依赖。这可以防止你不必搜索,下载和复制二进制包为你的依赖到你的项目目录。 清单条目 构建系统使您可以指定的值在生成配置清单文件中的某些元素。这些新的值将覆盖在manifest文件中的现有值。如果你想生成多个的 APK为您的项目中,他们每个人都有不同的包名,最小的SDK版本,或目标SDK版本,这是很有用的。 签名 构建系统使您可以指定生成配置签名设置,它可以在生成过程中签署您的APK。 ProGuard 构建系统使您可以指定一个不同的 ProGuard的规则文件的每个版本变量。构建系统可以运行ProGuard的生成过程来混淆你的类。 测试 构建系统生成的项目中的测试源测试APK,所以你不必创建一个单独的测试项目。构建系统可以在生成过程中运行测试。 Gradle构建文件使用Groovy的语法。Groovy是一种动态语言,你可以用它来 定义自定义生成逻辑,并与Android的插件Gradle提供了Android特有的元素进行交互。 按照惯例建立 Android Studio生成系统假定合理的默认值的项目结构和其他编译选项。 如果您的项目符合这些约定,你的Gradle构建文件是很简单的。当一些这些公约并不适用于你的项目,使您可以配置生成过程的几乎每一个方面。 例如,如果您的项目的源位于比默认值不同的目录,你可以在构建文件中指定此位置。 项目和模块 一个项目代表一个完整的Android应用程序。Android Studio项目包含一个或多个module 。一个module 是您的应用程序的独立组件, 你可以构建,测试或调试。module 包含您的应用程序的源代码和资源。Android的Studio项目包含三种模块: ...

2014年12月18日 · 7 分钟 · 天边的星星

Matrix学习3、Matrix的基本三种变换之Translation、Skew、Rotate

Matrix的3*3矩阵: **[java]** [view plain](http://blog.csdn.net/lonelyroamer/article/details/7626262#)[copy](http://blog.csdn.net/lonelyroamer/article/details/7626262#) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - {MSCALE_X,MSKEW_X,MTRANS_X, - MSKEW_Y,MSCALE_Y,MTRANS_Y, - MPERSP_0,MPERSP_1,MPERSP_2} 一、平移(Translation)变换 Translation的变换是通过改变MTRANS_X和MTRANS_Y来实现的,Matrix提供了三个方法 preTranslate(float dx, float dy) setTranslate(float dx, float dy) postTranslate(float dx, float dy) 平移的变换特别简单,相信学过数学的人都知道,不说了。 二、扭曲(Skew)变换 skew变换是通过改变MSKEW_X,和MSKEW_Y来实现的,Matrix提供了下面的几个方法来设置skew matrix.setSkew(kx, ky) matrix.setSkew(kx, ky, px, py) matrix.preSkew(kx, ky) matrix.preSkew(kx, ky, px, py) matrix.postSkew(kx, ky) matrix.postSkew(kx, ky, px, py) 经过自己测试,发现skew的变换是如下的规律: 点(x,y)经过skew(kx,ky,px,py)变换之后,坐标为(kx*(y-py)+px,ky*(x-px)+py),如果,px和py没有,则默认为都为0。 图片变换的效果 三、旋转(Rotate)的变换 **[java]** [view plain](http://blog.csdn.net/lonelyroamer/article/details/7626262#)[copy](http://blog.csdn.net/lonelyroamer/article/details/7626262#) <div> <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2"> </embed> </div> </div> - {MSCALE_X,MSKEW_X,MTRANS_X, - MSKEW_Y,MSCALE_Y,MTRANS_Y, - MPERSP_0,MPERSP_1,MPERSP_2} Rotate的变换是通过设置4个值来改变的,MSCALE_X,MSKEW_X,MSKEW_Y,MSCALE_Y来进行变换的,有如下的方法 ...

2014年12月18日 · 1 分钟 · 天边的星星

【Android 应用开发】 Android APK 反编译 混淆 反编译后重编译

反编译工具 : 总结了一下 linux, windows, mac 上的版本, 一起放到 CSDN 上下载; — CSDN 下载地址 : http://download.csdn.net/detail/han1202012/8221787 **[plain]** [view plain](http://blog.csdn.net/shulianghan/article/details/41697821#)[copy](http://blog.csdn.net/shulianghan/article/details/41697821#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/541288)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/541288/fork) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - octopus@octopus:~/decompiler$ tree -L 2 - . - ├── linux - │ ├── apktool - │ ├── dex2jar-0.0.9.15 - │ └── jd-gui - ├── mac - │ ├── apktool - │ ├── dex2jar-0.0.9.15 - │ └── jd-gui-0.3.5.osx.i686.dmg - ├── windows - │ ├── apkTool - │ ├── dex2jar-0.0.9.15 - │ └── jd-gui.exe - └── 源码 - └── apktool-source.zip - - 10 directories, 4 files ...

2014年12月18日 · 5 分钟 · 天边的星星

Android 图片的浏览、缩放、拖动和自动居中

http://www.cnblogs.com/dwinter/archive/2012/01/12/2321082.html Activity: **[html]** [view plain](http://blog.csdn.net/n70joey/article/details/7993188#)[copy](http://blog.csdn.net/n70joey/article/details/7993188#) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - /** - * 图片浏览、缩放、拖动、自动居中 - */ - public class Touch extends Activity implements OnTouchListener { - - Matrix <span class="attribute">matrix</span> = <span class="attribute-value">new</span> Matrix(); - Matrix <span class="attribute">savedMatrix</span> = <span class="attribute-value">new</span> Matrix(); - DisplayMetrics dm; - ImageView imgView; - Bitmap bitmap; - - float minScaleR;// 最小缩放比例 - static final float <span class="attribute">MAX_SCALE</span> = <span class="attribute-value">4f</span>;// 最大缩放比例 - - static final int <span class="attribute">NONE</span> = <span class="attribute-value"></span>;// 初始状态 - static final int <span class="attribute">DRAG</span> = <span class="attribute-value">1</span>;// 拖动 - static final int <span class="attribute">ZOOM</span> = <span class="attribute-value">2</span>;// 缩放 - int <span class="attribute">mode</span> = <span class="attribute-value">NONE</span>; - - PointF <span class="attribute">prev</span> = <span class="attribute-value">new</span> PointF(); - PointF <span class="attribute">mid</span> = <span class="attribute-value">new</span> PointF(); - float <span class="attribute">dist</span> = <span class="attribute-value">1f</span>; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.scale); - <span class="attribute">imgView</span> = (ImageView) findViewById(R.id.imag);// 获取控件 - <span class="attribute">bitmap</span> = <span class="attribute-value">BitmapFactory</span>.decodeResource(getResources(), this.getIntent() - .getExtras().getInt(&#8220;IMG&#8221;));// 获取图片资源 - imgView.setImageBitmap(bitmap);// 填充控件 - imgView.setOnTouchListener(this);// 设置触屏监听 - <span class="attribute">dm</span> = <span class="attribute-value">new</span> DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics(dm);// 获取分辨率 - minZoom(); - center(); - imgView.setImageMatrix(matrix); - } - - /** - * 触屏监听 - */ - public boolean onTouch(View v, MotionEvent event) { - - switch (event.getAction() & MotionEvent.ACTION_MASK) { - // 主点按下 - case MotionEvent.ACTION_DOWN: - savedMatrix.set(matrix); - prev.set(event.getX(), event.getY()); - <span class="attribute">mode</span> = <span class="attribute-value">DRAG</span>; - break; - // 副点按下 - case MotionEvent.ACTION_POINTER_DOWN: - <span class="attribute">dist</span> = <span class="attribute-value">spacing</span>(event); - // 如果连续两点距离大于10,则判定为多点模式 - if (spacing(event) <span class="tag">></span> 10f) { - savedMatrix.set(matrix); - midPoint(mid, event); - <span class="attribute">mode</span> = <span class="attribute-value">ZOOM</span>; - } - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_POINTER_UP: - <span class="attribute">mode</span> = <span class="attribute-value">NONE</span>; - break; - case MotionEvent.ACTION_MOVE: - if (<span class="attribute">mode</span> == DRAG) { - matrix.set(savedMatrix); - matrix.postTranslate(event.getX() &#8211; prev.x, event.getY() - &#8211; prev.y); - } else if (<span class="attribute">mode</span> == ZOOM) { - float <span class="attribute">newDist</span> = <span class="attribute-value">spacing</span>(event); - if (newDist <span class="tag">></span> 10f) { - matrix.set(savedMatrix); - float <span class="attribute">tScale</span> = <span class="attribute-value">newDist</span> / dist; - matrix.postScale(tScale, tScale, mid.x, mid.y); - } - } - break; - } - imgView.setImageMatrix(matrix); - CheckView(); - return true; - } - - /** - * 限制最大最小缩放比例,自动居中 - */ - private void CheckView() { - float p[] = new float[9]; - matrix.getValues(p); - if (<span class="attribute">mode</span> == ZOOM) { - if (p[0] <span class="tag"><</span> <span class="tag-name">minScaleR</span>) { - matrix.setScale(minScaleR, minScaleR); - } - if (p[0] <span class="tag">></span> MAX_SCALE) { - matrix.set(savedMatrix); - } - } - center(); - } - - /** - * 最小缩放比例,最大为100% - */ - private void minZoom() { - <span class="attribute">minScaleR</span> = <span class="attribute-value">Math</span>.min( - (float) dm.widthPixels / (float) bitmap.getWidth(), - (float) dm.heightPixels / (float) bitmap.getHeight()); - if (minScaleR <span class="tag"><</span> <span class="tag-name">1.0</span>) { - matrix.postScale(minScaleR, minScaleR); - } - } - - private void center() { - center(true, true); - } - - /** - * 横向、纵向居中 - */ - protected void center(boolean horizontal, boolean vertical) { - - Matrix <span class="attribute">m</span> = <span class="attribute-value">new</span> Matrix(); - m.set(matrix); - RectF <span class="attribute">rect</span> = <span class="attribute-value">new</span> RectF(0, 0, bitmap.getWidth(), bitmap.getHeight()); - m.mapRect(rect); - - float <span class="attribute">height</span> = <span class="attribute-value">rect</span>.height(); - float <span class="attribute">width</span> = <span class="attribute-value">rect</span>.width(); - - float <span class="attribute">deltaX</span> = <span class="attribute-value"></span>, <span class="attribute">deltaY</span> = <span class="attribute-value"></span>; - - if (vertical) { - // 图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下方留空则往下移 - int <span class="attribute">screenHeight</span> = <span class="attribute-value">dm</span>.heightPixels; - if (height <span class="tag"><</span> <span class="tag-name">screenHeight</span>) { - <span class="attribute">deltaY</span> = (screenHeight &#8211; height) / 2 &#8211; rect.top; - } else if (rect.top <span class="tag">></span> 0) { - <span class="attribute">deltaY</span> = -rect.top; - } else if (rect.bottom <span class="tag"><</span> <span class="tag-name">screenHeight</span>) { - <span class="attribute">deltaY</span> = <span class="attribute-value">imgView</span>.getHeight() &#8211; rect.bottom; - } - } - - if (horizontal) { - int <span class="attribute">screenWidth</span> = <span class="attribute-value">dm</span>.widthPixels; - if (width <span class="tag"><</span> <span class="tag-name">screenWidth</span>) { - <span class="attribute">deltaX</span> = (screenWidth &#8211; width) / 2 &#8211; rect.left; - } else if (rect.left <span class="tag">></span> 0) { - <span class="attribute">deltaX</span> = -rect.left; - } else if (rect.right <span class="tag"><</span> <span class="tag-name">screenWidth</span>) { - <span class="attribute">deltaX</span> = <span class="attribute-value">screenWidth</span> &#8211; rect.right; - } - } - matrix.postTranslate(deltaX, deltaY); - } - - /** - * 两点的距离 - */ - private float spacing(MotionEvent event) { - float <span class="attribute">x</span> = <span class="attribute-value">event</span>.getX(0) &#8211; event.getX(1); - float <span class="attribute">y</span> = <span class="attribute-value">event</span>.getY(0) &#8211; event.getY(1); - return FloatMath.sqrt(x * x + y * y); - } - - /** - * 两点的中点 - */ - private void midPoint(PointF point, MotionEvent event) { - float <span class="attribute">x</span> = <span class="attribute-value">event</span>.getX(0) + event.getX(1); - float <span class="attribute">y</span> = <span class="attribute-value">event</span>.getY(0) + event.getY(1); - point.set(x / 2, y / 2); - } - } ...

2014年12月18日 · 5 分钟 · 天边的星星

Android 开发 之 JNI入门 – NDK从入门到精通

NDK项目源码地址 : 转载出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 开发环境介绍 : — eclipse : adt-bundle-windows-x86-20130917 — sdk : 版本 2.3.3 — ndk : android-ndk-r9c-windows-x86.zip — cygwin : 所需组件 binutils , gcc , gcc-mingw , gdb , make; — javah : jdk6.0自带工具 — javap : jdk6.0自带工具 **JNI 总结 : ** Java 调用 C 流程 : — a. 定义 Native 方法 : 在 shuliang.han.ndkparameterpassing.DataProvider.java 类中定义 Native 方法 public native int add(int x, int y); — b. 生成方法签名 : 进入 AndroidProject/bin/classes 目录, 使用 **javah **shuliang.han.ndkparameterpassing.DataProvider 命令, 便生成了头文件, 该头文件引用了 jni.h, 以及定义好了 对应的 Native 方法, 生成 JNIEXPORT jint JNICALL Java_shuliang_han_ndkparameterpassing_DataProvider_add (JNIEnv *, jobject, jint, jint); ...

2014年12月18日 · 37 分钟 · 天边的星星