如何在XML中使用自定义Animation动画类

在安卓应用的动画开发中,可能SDK中自带的补间动画不能满足应用的需求,需要在Java代码中自定义一些动画类,当然都是继承自Animation类。实现之后,我们一般直接在代码中使用,类似下面这样:

1
2
3
4
CustomAnimation customAnimation = new CustomAnimation();
customAnimation.setDuration(3000);
customAnimation.setFillAfter(true);
effectView.startAnimation(customAnimation);

当View同时要应用像Scale,Alpha这样的补间动画时,你就需要多添加类似下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CustomAnimation customAnimation = new CustomAnimation();
customAnimation.setDuration(3000);
customAnimation.setFillAfter(true);
Animation scaleAnimation = new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
Animation alphaAnimation = new AlphaAnimation(0.1f,1.0f);
scaleAnimation.setDuration(10000);
alphaAnimation.setDuration(10000);
AnimationSet set = new AnimationSet(true);
set.addAnimation(customAnimation);
set.addAnimation(scaleAnimation);
set.addAnimation(alphaAnimation);
set.setFillAfter(true);
set.setFillEnabled(true);
effectView.startAnimation(set);

Android WebView开发问题及优化汇总

我们在native与网页相结合开发的过程中,难免会遇到关于WebView一些共通的问题。就我目前开发过程中遇到的问题以及最后得到的优化方案都将在这里列举出来。有些是老生常谈,有些则是个人摸索得出解决方法。下面就是整理得到的些干货。

1.加快HTML网页装载完成的速度

默认情况html代码下载到WebView后,webkit开始解析网页各个节点,发现有外部样式文件或者外部脚本文件时,会异步发起网络请求下载文件,但如果在这之前也有解析到image节点,那势必也会发起网络请求下载相应的图片。在网络情况较差的情况下,过多的网络请求就会造成带宽紧张,影响到css或js文件加载完成的时间,造成页面空白loading过久。解决的方法就是告诉WebView先不要自动加载图片,等页面finish后再发起图片加载。

翻译:JNI Tips in Android Training Course

原文链接:http://developer.android.com/training/articles/perf-jni.html

这篇google官方的培训课程提出了在使用NDK做本地开发时的一些优化建议,如避免FindClass重复查找,内存泄露,常用的数组操作和系统版本中的一些兼容检查问题。对于使用C/C++完成安卓共享库或者ELF程序的开发者,看了这篇文章就会少踩很多坑。如果当中有翻译欠妥的地方,欢迎一起交流沟通^_^!

全部译文如下。

JNI Tips

JNI全称Java Native Interface。它为托管代码(使用Java编程语言编写)与本地代码(使用C/C++编写)提供了一种交互方式。它是与厂商无关的(vendor-neutral),支持从动态共享库中加载代码,虽然这样会稍显麻烦,但有时这是相当有效的。

如果你对JNI还不是太熟悉,可以先通读Java Native Interface Specification这篇文章来对JNI如何工作以及哪些特性可用有个大致的印象。这种接口的一些方面不能立即一读就显而易见,所以你会发现接下来的几个章节很有用处。

App版本更新时对SQLite数据库升级或者降级遇到的问题

SQLite是Android内置的一个很小的关系型数据库。SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类。我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定义操作。下面两个方法必须重写:

  • public void onCreate(SQLiteDatabase db)
  • public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

另外SQLiteOpenHelper子类在构造实例时必须指定当前数据库的名称(name)、版本号(version)。而这里名称就决定了数据库存储时的文件名称,而这里的版本号与App在AndroidMainfest.xml定义的versionCode没有绝对关联。也就是在App更新时如果数据库的数据结构没有发生变化那么数据库的版本号则不用增加。

onCreate:调用时机是用户首次安装应用后启动,或是清除App数据库文件后启动。这时可以在这个函数中完成初始的数据表的创建。

onUpgrade:调用时机是用户在做应用更新,覆盖安装后启动,如果新版本中数据库版本号要比旧版本中的数据库版本号高则会调用。这时可以在这个函数完成数据库版本升级带来的旧版本的兼容问题,以及数据迁移问题。

一个抽奖应用的逆向破解全流程

东窗事发

偶然见到一个应用内有抽奖的活动(应用具体名称就不便告知),而且是每天都可以抽。同时抽奖之前也不需要用户登录什么的,但限定了用户一天(自然天)只能抽奖一次。那么应用的服务端在用户没有登录的情况下是依据什么来判定当前用户今天是否已抽过奖了呢?这当中判断的依据是否可靠,能否被伪造然后实现一天多次抽奖呢?带着这些问题,让我们来剥开应用的层层外纱。

初识庐山

首先在PC端打开LogCat,然后手机连接PC,最后手机上打开该应用的抽奖界面。这时我们在LogCat中发现了该应用输出的如下日志:

Windows下将ImageMagick移植到Android平台

ImageMagick是一个用来创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。在移动平台做一些较复杂的图像处理时,难免会请出这尊大神。官方网站上也说明了它可以运行在多个平台之上,包括Android。不过官方的Releases版本只有Unix、Mac OS X、IOS、Windows,并有把针对Android各种架构发布现成的二进制包。不过好在它完全是开源的,我们完全可以下载源码然后自己交叉编译(Cross-Compile)出基于arm、x86、mips运行系统的静态链接库,这样就可以在目前的Android全平台下跑起来了。

一般我们办公都在Windows平台,可是要用源码交叉编译(Source Cross-Compile)就得使用GNU环境,如果单独装一个linux虚拟机再来编译过程太过麻烦。我们可以在windows上使用MinGW工具来模拟一套GNU环境。