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 分钟 · 天边的星星

AndroidUI设计 之 图片浏览器

图片浏览器效果图 : 源码下载地址 : — CSDN : http://download.csdn.net/detail/han1202012/6875083 — GitHub : https://github.com/han1202012/AndroidPictureViewer.git . 作者 :**万境绝尘 ** 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 一. 图片浏览器显示界面ImageView介绍 1. ImageView的上下继承结构 下面是API中的结构: [java.lang.Object](http://developer.android.com/reference/java/lang/Object.html) ↳ <td class="jd-inheritance-class-cell" colspan="2"> [android.view.View](http://developer.android.com/reference/android/view/View.html) </td> <td class="jd-inheritance-space"> </td> <td class="jd-inheritance-class-cell" colspan="1"> android.widget.ImageView </td> [![](http://developer.android.com/assets/images/triangle-closed.png)](http://developer.android.com/reference/android/widget/ImageView.html#)Known Direct Subclasses <div id="subclasses-direct"> <div id="subclasses-direct-list" class="jd-inheritedlinks"> [ImageButton](http://developer.android.com/reference/android/widget/ImageButton.html), [QuickContactBadge](http://developer.android.com/reference/android/widget/QuickContactBadge.html) </div> </div> </td> [![](http://developer.android.com/assets/images/triangle-closed.png)](http://developer.android.com/reference/android/widget/ImageView.html#)Known Indirect Subclasses <div id="subclasses-indirect"> <div id="subclasses-indirect-list" class="jd-inheritedlinks"> [ZoomButton](http://developer.android.com/reference/android/widget/ZoomButton.html) </div> </div> </td> ...

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

Android开发学习之ImageView手势拖拽、缩放、旋转

在Android应用中,图片随手势的拖拽、缩放、旋转在很多场景中都会用到,今天我们要做的就是在ImageView的基础上实现一个可以拖拽、缩放、转转的TouchView。 一、实现原理 OnTouch事件捕捉+Matrix矩阵变换 二、核心方法 拖拽:Matrix.postTranslate(DeltalX, DeltalY); 缩放:Matrix.postScale(mScale, mScale, mPoint.x, mPoint.y); 旋转:Matrix.postRotate(Angle, mPoint.x, mPoint.y); 三、具体实现 package com.Android.TouchView; /* * Android多点触控技术练习 * @Author:Robin * @Date:2013年12月29日 * @边界处理暂时不知道怎么写啊 * 目前的问题有: * 手势识别不是很顺畅,经常出现该放缩时放缩不了的情况 * 由于没有边界判断,程序可能会出现崩溃 */ import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PaintFlagsDrawFilter; import android.graphics.PointF; import android.util.DisplayMetrics; import android.util.FloatMath; import android.view.MotionEvent; import android.widget.ImageView; @SuppressLint({ "ViewConstructor", "FloatMath" }) public class MultiTouchView extends ImageView { //本地图像资源 private int mDrawable; //图像位图 private Bitmap mBitmap; //屏幕宽度 private int ScreenWidth; //屏幕高度 private int ScreenHeight; //原始图像矩阵 private Matrix mMatrix=new Matrix(); //过程图像矩阵 private Matrix mSavedMatrix=new Matrix(); //结果图像矩阵 private Matrix mResultMatrix=new Matrix(); //定义三种模式:None、Drag、Zoom public static final int Mode_None=0; public static final int Mode_Drag=1; public static final int Mode_Zoom=2; //当前操作模式 private int mMode=Mode_None; //当前坐标 private float mDownX,mDownY; //存储两点间的距离 private float mDistance=0f; //存储旋转角 @SuppressWarnings("unused") private float mAngle=0f; //存储中点 private PointF mPoint; //最大缩放比例 //private float MaxScale=3f; //最小缩放比例 //private float MinScale=0.5f; public MultiTouchView(Activity mActivity ,int Drawable) { super(mActivity); //设置当前图片资源 this.mDrawable=Drawable; //获取Bitmap mBitmap=BitmapFactory.decodeResource(getResources(), mDrawable); DisplayMetrics dm=new DisplayMetrics(); mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm); //获取屏幕宽度和高度 ScreenWidth=dm.widthPixels; ScreenHeight=dm.heightPixels; mMatrix=new Matrix(); } @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { //消除图像锯齿 canvas.setDrawFilter(new PaintFlagsDrawFilter(0,Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG)); canvas.save(); //绘制图像 canvas.drawBitmap(mBitmap, mMatrix, null); canvas.restore(); } @Override public boolean onTouchEvent(MotionEvent Event) { switch(Event.getAction()) { //单点触控处理 case MotionEvent.ACTION_DOWN: //设置当前操作模式为Drag mMode=Mode_Drag; //获取当前坐标 mDownX=Event.getX(); mDownY=Event.getY(); mSavedMatrix.set(mMatrix); break; //多点触控处理 case MotionEvent.ACTION_POINTER_DOWN: mMode=Mode_Zoom; //获取两点间距离 mDistance=getDistance(Event); //获取旋转角 mAngle=getAngle(Event); //获取中点 mPoint=getMidPoint(Event); mSavedMatrix.set(mMatrix); break; case MotionEvent.ACTION_MOVE: //缩放处理 if(mMode==Mode_Zoom) { mResultMatrix.set(mSavedMatrix); //获取缩放比率 float mScale=getDistance(Event)/mDistance; //获取旋转角,这里可以不用 //float Angle=getAngle(Event)-mAngle; //以中点为中心,进行缩放 mResultMatrix.postScale(mScale, mScale, mPoint.x, mPoint.y); //以中点为中心,进行旋转,这里可以不用 //mResultMatrix.postRotate(Angle, mPoint.x, mPoint.y); mMatrix.set(mResultMatrix); invalidate(); }else if(mMode==Mode_Drag)//平移处理 { mResultMatrix.set(mSavedMatrix); //计算平移量 float DeltalX=Event.getX()-mDownX; float DeltalY=Event.getY()-mDownY; //平移 mResultMatrix.postTranslate(DeltalX, DeltalY); mMatrix.set(mResultMatrix); invalidate(); } break; case MotionEvent.ACTION_UP: //这里要不要处理呢,如果需要,怎么办 case MotionEvent.ACTION_POINTER_UP: mMode = Mode_None; break; } return true; } //返回两点间的距离 public float getDistance(MotionEvent Event) { //计算X的变化量 float DeltalX=Event.getX(0)-Event.getX(1); //计算Y的变化量 float DeltalY=Event.getY(0)-Event.getY(1); //计算距离 return FloatMath.sqrt(DeltalX*DeltalX+DeltalY*DeltalY); } //返回两点的中点 @SuppressLint("FloatMath") public PointF getMidPoint(MotionEvent Event) { float X=Event.getX(0)+Event.getX(1); float Y=Event.getY(0)+Event.getY(1); return new PointF(X/2,Y/2); } //获得旋转角 public float getAngle(MotionEvent Event) { double DeltalX=Event.getX(0)-Event.getX(1); double DeltalY=Event.getY(0)-Event.getY(1); return (float)Math.atan2(DeltalX, DeltalY); } //边界处理,暂时没找到比较好的方法 public boolean CheckBounary() { return false; } //存储当前图片 public Bitmap SaveImage() { Bitmap mBitmap = Bitmap.createBitmap(ScreenWidth, ScreenHeight,Config.ARGB_8888); Canvas mCanvas = new Canvas(mBitmap); mCanvas.drawBitmap(mBitmap, mMatrix, null); mCanvas.save(Canvas.ALL_SAVE_FLAG); mCanvas.restore(); return mBitmap; } } ...

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

Android中用Matrix实现ImageView里的图片平移和缩放动画

注: 这里说的图片的平移和缩放不是对ImageView整个view进行的,而是对ImageView里面的图片进行的(view本身没有什么变化),所以Android自带的动画效果不能满足需求。 **功能点**: 1、一开始可以像centerCrop一样显示图片(觉得scaleType为centerCrop时显示效果比较好,图片会铺满整个View,而且图片本身的分辨率不变) 2、对ImageView里的图片平移或放大 3、将这个平移或放大做成一个动画效果 **一、在ScaleType为matrix的情况下实现centerCrop的显示效果** 要充分利用Android的源码,看ImageView的源代码就可以简单很多,在configureBounds()方法中: ![Android中用Matrix实现ImageView里的图片平移和缩放动画 - Johnny - Lucky Johnnys blog](http://img1.ph.126.net/0bRpjujvQhurl7HNuYa99g==/4826169950781049609.png) 不过为了之后的平移,要保证图片的宽度比View的宽度大 <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setImage </span><span class="pun">(</span> <span class="typ">Drawable</span><span class="pln"> drawable </span><span class="pun">)</span> <span class="pun">{</span> <span class="kwd">if</span> <span class="pun">(</span> <span class="kwd">null</span> <span class="pun">==</span><span class="pln"> drawable </span><span class="pun">)</span> <span class="kwd">return</span><span class="pun">;</span> <span class="kwd">int</span><span class="pln"> dwidth </span><span class="pun">=</span><span class="pln"> drawable</span><span class="pun">.</span><span class="pln">getIntrinsicWidth </span><span class="pun">();</span> <span class="kwd">int</span><span class="pln"> dheight </span><span class="pun">=</span><span class="pln"> drawable</span><span class="pun">.</span><span class="pln">getIntrinsicHeight </span><span class="pun">();</span> <span class="kwd">int</span><span class="pln"> vwidth </span><span class="pun">=</span><span class="pln"> mWidth</span><span class="pun">;</span> <span class="kwd">int</span><span class="pln"> vheight </span><span class="pun">=</span><span class="pln"> mHeight</span><span class="pun">;</span> <span class="kwd">float</span><span class="pln"> scale </span><span class="pun">=</span> <span class="lit">1.0f</span><span class="pun">;</span> <span class="kwd">float</span><span class="pln"> dx </span><span class="pun">=</span> <span class="lit"></span><span class="pun">,</span><span class="pln"> dy </span><span class="pun">=</span> <span class="lit"></span><span class="pun">;</span> <span class="kwd">if</span> <span class="pun">(</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> vheight </span><span class="pun">></span><span class="pln"> vwidth </span><span class="pun">*</span><span class="pln"> dheight </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vheight </span><span class="pun">/</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> dheight</span><span class="pun">;</span> <span class="pln"> dx </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vwidth </span><span class="pun">&#8211;</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span> <span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span> <span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vwidth </span><span class="pun">/</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> dwidth</span><span class="pun">;</span> <span class="pln"> dy </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vheight </span><span class="pun">&#8211;</span><span class="pln"> dheight </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span> <span class="pun">}</span> <span class="kwd">if</span> <span class="pun">(</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun"><</span> <span class="lit">2</span> <span class="pun">*</span><span class="pln"> vwidth </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vwidth </span><span class="pun">/</span> <span class="pun">(</span> <span class="lit">2.0f</span> <span class="pun">*</span><span class="pln"> dwidth </span><span class="pun">);</span> <span class="pln"> dx </span><span class="pun">=</span> <span class="pun">&#8211;</span><span class="pln"> dwidth </span><span class="pun">/</span> <span class="lit">2</span><span class="pun">;</span> <span class="pln"> dy </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vheight </span><span class="pun">&#8211;</span><span class="pln"> dheight </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span> <span class="pun">}</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">();</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">setScale </span><span class="pun">(</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> scale </span><span class="pun">);</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postTranslate </span><span class="pun">(</span><span class="pln"> dx</span><span class="pun">,</span><span class="pln"> dy </span><span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageDrawable </span><span class="pun">(</span><span class="pln"> drawable </span><span class="pun">);</span> <span class="pun">}</span> <span class="com">// vwidth和vheight使用确定的值,因为如果在应用初始化时view.getWidth()可能为0</span> **二、利用Matrix实现平移和放大** 平移和放大都是在当前图片的基础上,先用mImage.getImageMatrix()得到当前的matrix,再用Matrix的postTranslate或postScale方法就可以了。 需要注意的是: 如果用Matrix matrix = mImage.getImageMatrix (); //matrix只是得到一个对象的引用 应该用Matrix matrix = new Matrix ( mImage.getImageMatrix () );//这样才是得到一个克隆对象 **三、用ValueAnimator实现动画效果** 1、平移 dx为负是向左平移,为正是向右平移 因为图片的宽度设置为至少是view的2倍,所以向左和向右平移的最大距离都是vwidth / 2。 <span class="kwd">private</span> <span class="kwd">class</span> <span class="typ">MyTransXAnimatorListener</span> <span class="kwd">implements</span> <span class="typ">AnimatorUpdateListener</span> <span class="pun">{</span> <span class="kwd">private</span> <span class="typ">Matrix</span><span class="pln"> mPrimaryMatrix</span><span class="pun">;</span> <span class="kwd">public</span> <span class="typ">MyTransXAnimatorListener</span> <span class="pun">(</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> mPrimaryMatrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pun">}</span> <span class="lit">@Override</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> onAnimationUpdate </span><span class="pun">(</span> <span class="typ">ValueAnimator</span><span class="pln"> animation </span><span class="pun">)</span> <span class="pun">{</span> <span class="kwd">int</span><span class="pln"> dx </span><span class="pun">=</span> <span class="pun">(</span> <span class="typ">Integer</span> <span class="pun">)</span><span class="pln"> animation</span><span class="pun">.</span><span class="pln">getAnimatedValue </span><span class="pun">();</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> mPrimaryMatrix </span><span class="pun">);</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postTranslate </span><span class="pun">(</span><span class="pln"> dx</span><span class="pun">,</span> <span class="lit"></span> <span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pun">}</span> <span class="pun">}</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setTranslateAnimation </span><span class="pun">()</span> <span class="pun">{</span> <span class="typ">ValueAnimator</span><span class="pln"> animator </span><span class="pun">=</span> <span class="typ">ValueAnimator</span><span class="pun">.</span><span class="pln">ofInt </span><span class="pun">(</span> <span class="lit"></span><span class="pun">,</span> <span class="pun">&#8211;</span> <span class="lit">60</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">addUpdateListener </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">MyTransXAnimatorListener</span> <span class="pun">(</span><span class="pln"> mImage</span><span class="pun">.</span><span class="pln">getImageMatrix</span><span class="pun">()</span> <span class="pun">)</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setDuration </span><span class="pun">(</span> <span class="lit">1000</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setInterpolator </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">DecelerateInterpolator</span> <span class="pun">()</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setStartDelay </span><span class="pun">(</span> <span class="lit">500</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">start </span><span class="pun">();</span> <span class="pun">}</span> 2、放大 放大要设置中心点为ImageView的中心 <span class="kwd">private</span> <span class="kwd">class</span> <span class="typ">MyScaleAnimatorListener</span> <span class="kwd">implements</span> <span class="typ">AnimatorUpdateListener</span> <span class="pun">{</span> <span class="kwd">private</span> <span class="typ">Matrix</span><span class="pln"> mPrimaryMatrix</span><span class="pun">;</span> <span class="kwd">public</span> <span class="typ">MyScaleAnimatorListener</span> <span class="pun">(</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> mPrimaryMatrix </span><span class="pun">=</span><span class="pln"> matrix</span><span class="pun">;</span> <span class="pun">}</span> <span class="lit">@Override</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> onAnimationUpdate </span><span class="pun">(</span> <span class="typ">ValueAnimator</span><span class="pln"> animation </span><span class="pun">)</span> <span class="pun">{</span> <span class="kwd">float</span><span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="typ">Float</span> <span class="pun">)</span><span class="pln"> animation</span><span class="pun">.</span><span class="pln">getAnimatedValue </span><span class="pun">();</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> mPrimaryMatrix </span><span class="pun">);</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postScale </span><span class="pun">(</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> mWidth </span><span class="pun">/</span> <span class="lit">2</span><span class="pun">,</span><span class="pln"> mHeight </span><span class="pun">/</span> <span class="lit">2</span> <span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pun">}</span> <span class="pun">}</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setScaleAnimation </span><span class="pun">()</span> <span class="pun">{</span> <span class="typ">ValueAnimator</span><span class="pln"> animator </span><span class="pun">=</span> <span class="typ">ValueAnimator</span><span class="pun">.</span><span class="pln">ofFloat </span><span class="pun">(</span> <span class="lit">1.0f</span><span class="pun">,</span> <span class="lit">1.2f</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">addUpdateListener </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">MyScaleAnimatorListener</span> <span class="pun">(</span><span class="pln"> mImage</span><span class="pun">.</span><span class="pln">getImageMatrix </span><span class="pun">()</span> <span class="pun">)</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setDuration </span><span class="pun">(</span> <span class="lit">1000</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setInterpolator </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">DecelerateInterpolator</span> <span class="pun">()</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setStartDelay </span><span class="pun">(</span> <span class="lit">500</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">start </span><span class="pun">();</span> <span class="pun">}</span> 转自:http://xie2010.blog.163.com/blog/static/2113173652014221240951/

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

Android浏览图片,点击放大至全屏效果

最近做一个项目类似于QQ空间,做到照片浏览的功能,对于QQ空间中点击图片放大至全屏,感觉效果很赞,于是也做了个类似的效果。如下。 我不知道QQ那个是怎么做的,我的思路如下: 首先,从图片缩略界面跳转到图片详情页面,应该是从一个Activity跳转到另外一个Activity,应该图片详情页面也有很多操作,用View或者Dialog不是很好。所以现在难点就是,如何使得前一个界面的ImageView在另外一个界面做缩放切割动画。 一般缩略界面的ImageView的是如上图所示的正方形的,并且是CENTER_CROP缩放属性的。CENTER_CROP属性会导致ImageView中显示的Bitmap有被切割达到填充的效果。 而详情页面的ImageView一般都是FIT_CENTER的缩放属性。所以要保证这个跳转动画的流畅,要做如下的变化: 1、Bitmap的缩放,因为缩略图和详情图的缩放比例肯定不一样 2、Bitmap位置的平移,因为缩略图的位置是不确定的,我们要使他平移到中间 3、Bitmap的切割,因为CENTER_CROP是切割过得,而FIT_CENTER是没有切割的,那么两幅图显示的内容区域是不同的,所以也要显示区域的平滑变换。 要完成上面的效果,如果单单是指对ImageView做一个动画变换,我觉得是完成不了这个要求的。所以自己重写了ImageView来完成上述的变换。 直接贴上主要的ImageView **[java]** [view plain](http://blog.csdn.net/lonelyroamer/article/details/25497737#)[copy](http://blog.csdn.net/lonelyroamer/article/details/25497737#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/338428)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/338428/fork) package com.roamer.ui.view; import android.animation.Animator; import android.animation.PropertyValuesHolder; ...

2014年12月17日 · 6 分钟 · 天边的星星