AndroidStudio导入库文件

今来看看Android Studio怎么使用第三方库~网上找了很多教程貌似都有问题,自己尝试了一下,简单易行,亲测有效~ 第一步:准备好Android Studio格式的库文件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BUeL3azw-1587400315304)(http://img.blog.csdn.net/20150916073333627)] 这是一个SlidingMenu的库文件,点击这里下载SlidingMenu;大家可以下载来做测试~如果是Eclipse出身的库,还不知道该怎么办,以后遇到再说吧~ 第二步:在项目内点击File -> New -> Import Module导入模块 然后选择第三方库的根目录 如果已经包含这个模块,会出现感叹号后面的提示,第一次肯定没有啦~ 这时,切换到Project视图,就能看到库文件已经导入了~ 第三步:修改库文件的build.gradle文件 这个是自己应用的build.gradle文件内容 我们要保证compoleSdkVersion,buildToolsVersion,minSdkVersion,targetSdkVersion在app和导入的库文件中都一致~ 下面是修改之后的库文件里的build.gradle~ 第四步:在Project视图下找到工程的build.gradle文件,替换库文件的classpath 将文件中的classpath ‘com.android.tools.build:gradle:1.3.0’一行,复制到库文件的gradle文件中,替换相应的classpath行,保证一致~ 第五步:这个不是通用步骤(可忽略) SlidingMenu中使用的是android.util.FloatMath类,导入的时候会报错;原因是这个类已经过时了,建议使用java.lang.Math类~只需要找到相应的错误,将FloatMath替换成Math类即可~ 第六步:设置项目依赖关系 以添加Module dependency的形式,关联库文件;然后Clean一下Project~ SlidingMenu就等着你折腾了~ 这样看来,Android Studio中导入第三方库的过程应该都大同小异吧~

Android事件处理机制轻量级源码分析

正确理解Android中的事件分发和拦截机制,对于在多个ViewGroup和View嵌套以及自定义控件的时候能够正常处理用户行为至关重要。 如果要把源码一行一行看,研究事件处理机制就要到天荒地老了。这是为什么这篇博客叫轻量级源码分析,简单易懂。屏蔽掉了冗长的无需太过关心的源码,把握一下几行重点,其实事件处理就可以有一定的了解了。这篇博文就是根据源码一步一步走了一下事件处理的流程,分模块来看应该思路应该会比较清晰一点~ 事件分发和拦截101 开始之前首先明确一下,在源码当中,理解事件分发,关注一下dispatchTouchEvent()方法;理解事件拦截,再多关注一个onInterceptTouchEvent()方法即可~ 还有噢,dispatchTouchEvent()方法返回true表示响应全部事件,而返回false则表示只响应第一个事件,忽略后续的事件~onInterceptTouchEvent()方法返回true表示拦截事件,子View不会接收到该事件;返回false表示不拦截事件,向子View传递该事件,让子View尝试处理~ 哟西~ Let`s hacking… 一、View的事件处理机制 View中的事件分发对于本身可以被点击和不可被点击的View有些许不同~ 1. View的事件分发之不可被点击的View 先看一个小示例哟~这一小段代码中有两个控件,一个ImageView,一个Button,这两个控件最终都是继承View的,就用这两个控件来阐述一下View的事件处理机制 这一小段代码,还是粘上来吧~ 先说一说本身不可被点击的ImageView~这里给imageView添加一个onTouchListener,我们看看在return false的情况下,单击一次,打印了几次输出信息~ 运行之后发现输出了imageView eventAction = 0。由于一次单击包括按下和抬起两个操作(0表示按下的操作,1表示抬起的操作),因此从这个现象可以看出,抬起的操作在这个情况下没有被监测到。想知道为什么,就来看看源码咯~ ImageView是继承View的(继承了dispatchTouchEvent()方法),所以应该到View的源码中查看一下dispatchTouchEvent()(我们要关注的就是这个方法嘛)方法,看看View是怎么进行事件分发的(就知道ImageView是怎么处理事件的了)。过滤了不必要的代码之后,应该关注的代码如下: dispatchTouchEvent()方法 View的dispatchTouchEvent()方法中,这个if语句的意思是说,如果mOnTouchListener 引用不为空,并且当前要接收事件的控件(此处就是这个IamgeView)处于可用状态(只要不设置setEnable = false,这个条件是始终成立的,所以后面就不说这个条件了),并且mOnTouchListener这个引用的onTouch方法返回了true,那么整个dispatchTouchEvent()就返回true,否则返回onTouchEvent(event)方法执行的结果。 那么ImageView被点击之后,是否执行了if语句呢?下面来判断一下if中的条件该ImageView是否满足~ 所以呢,此时的ImageView是不会执行dispatchTouchEvent()方法中的if语句块的,而会执行其所继承的onTouchEvent(event)方法,并返回相应的布尔结果。 到这里,还无法得知为什么ImageView上的抬起事件没有被监测到。那就来看看这个onTouchEvent(event)方法到底干了什么。这个方法代码超长的,哈哈,轻量级源码如下: onTouchEvent()方法 这里又有一个if语句块,这个if说,如果你这个接收事件的控件可以被点击,或者可以被长点击,那么就执行if中的逻辑,然后返回true,否则整个方法返回false。那就来看看我们的ImageView是否满足条件咯~ 然后再回到dispatchTouchEvent()方法,既然此时的ImageView不能执行if中的代码,而onTouchEvent()方法又返回了false,所以整个dispatchTouchEvent()就返回了false。根据文章开头所说dispatchTouchEvent()返回true和false的意义得知,这个单击事件整体只有按下会被处理,所以就只会打印一次输出信息咯~ 如果想让ImageView同时响应按下和抬起的事件,该怎么办呢?有两个方式: 2. View的事件分发之可以被点击的View 接下来就说说Button这个东西~ 在同样的环境下,同样地为Button添加了一个触摸事件监听器,在onTouch()方法中返回了false;运行之后,输出了Button eventAction = 0和Button eventAction = 1。这里同样返回false,为什么就能打印两次信息,为什么Button的整个单击事件可以被完全监测呢? 原因就在于Button本身是可以被点击的;在其他条件都相同的情况下,Button本身可以被点击的属性,可以让其执行onTouchEvent()方法中的if语句 onTouchEvent()方法 从而返回true;进而dispatchTouchEvent()方法返回true,单击事件的按下和抬起都会被监测~ 3. onClick()、onTouch()和onTouchEvent的调用顺序 上面一点很好理解。那进一步,如果也给Button再来一个setOnClickListener()呢?就像这样 在onTouch()方法返回false的情况下,还会打印”button onclick”的信息吗? 运行之后发现,”button onclick”的信息在Button eventAction =…

Android Studio最新版本(1.3)JNI开发流程总结

JNI应该是Android开发人员的标配了~从Eclipse转到Android Studio有好多东西就必须重新学习。网上已有的对于Android Studio JNI开发的博文貌似都有些问题,在最新版本的Studio一些步骤已经无法使用。花了些时间重新整理了一下整个JNI开发的流程。环境:Android Studio 1.3.2;MackBook Pro 第一步:如果还没有在Studio中下载NDK的话,打开项目结构,然后点击Android NDK location一栏下面的Download NDK,开始下载NDK(需要翻墙) 下载完成之后,Studio自动帮我们安装;之后会自动将项目默认结构设置中的NDK位置(Close Project -> Configure -> Project Defaults -> Project Structure -> Android NDK location)设置到当前NDK的安装位置。 第二步:配置完NDK环境,就可以开始写本地方法了。先在MainActivity中添加一个本地方法 第三步:点击Build -> Make Project,生成项目的字节码文件(至此,这些步骤跟已有的没有什么区别) 第四步:生成头文件这一步有些不同。其他博文上要求在Terminal中切换到main目录,然后输入javah -d jni ….. <包名.类名>一大堆命令,但是发现这个命令无法使用,会有如下报错 这里说没有制定classes文件,所以就试试用其他方法生成头文件。在控制台(在项目根目录)输入: 这样,在java目录下,会生成一个.h头文件 第五步:在main文件夹下,新建一个jni文件夹,然后将刚生成的头文件拷贝到该文件夹中 第六步:创建C代码,这个例子就是完成点击按钮,调用本地方法,然后输出C代码中的一个字符串到控制台 第七步:在jni文件夹加入Android.mk文件和Application.mk文件 第八步:在MainActivity中加载模块 第九步:/app/build.gradle的defaultConfig中加入ndk配置;moduleName的值就是Android.mk中LOCAL_MODULE的值 如果是通过第一步Studio自动安装的NDK的话,那么项目的local.properties中会自动加上ndk的路径;如果没有,请务必手动添加 如果这个时候编译整个工程,会报出 这样的错误;这里只要根据提示,在gradle.properties中加入”android.useDeprecatedNdk=true”即可 然后重新编译,即可成功部署。