Using Animation in your application
PS:这个主题的日志标题居然不支持中文,懒得花时间去该,就用英文标题了
android大概有四种实现动画的方式:
1. GIF图片实现
2. Frame-by-frame (好像是通过AnimationDrawable类来实现,目前还没研究)
3. OpenGL ES (说到动画怎么能不提到OpenGL呢)
4. Tweened animation (通过xml文件配置动画效果,绑定到指定控件上,这篇日志所记录的方式)
添加动画资源
在res->anim目录下建立 anim.xml
这段xml代码定义了一个动画效果,alpha值从0到1,时间花费1000毫秒(即1秒)
将动画绑定到指定控件上
Animation fadeIn = AnimationUtils.loadAnimaition(R.anim.anim); // 比如有个TextView的控件,id为 title TextView title = (TextView)findViewById(R.id.title); // 指定控件的动画效果 title.setAnimation(fadeIn);
这样就简单得实现动画效果与控件的绑定。
取消动画效果与控件的绑定
title.clearAnimation();
指定动画效果的事件监听
动画的生命周期有三个: start, end, repeat
示例代码如下:
title.setAnimaitionListener(new AnimationListener(){ public void onAnimationEnd(Animation animation) { Intent intent = new Intent(mainActivity.this, ToActivity.class); startActivity(intent); mainActivity.this.finish(); } public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } });
利用LayoutAnimationController指定一组控件的动画效果
LayoutAnimationController controller = new LayoutAnimationController(fadeIn); // 假设有个TableRow控件的ID为 row TableRow row = (TableRow)findViewById(R.id.row); row.setLayoutAnimation(controller);
通过setLayoutAnimation方法,我们就可以给TableRow下的所有元素设定同一个动画效果。有一个需要注意的地方,TableRow下的元素的效果并不是同一时间开始运行的。比如本日志的这个例子,定义动画的xml文件中,alpha节点的android:duration属性,指定整个动画效果执行所需要的时间,在这里我们设定了1000,那么,TableRow下的元素将会一个一个运行,间隔时间为android:duration的1/2(无论TableRow下有多少个空间,都是1/2),在这里就是0.5秒。比如TableRow下有两个控件,那么当第一个控件动画效果执行到0.5秒时,第二个控件才开始执行。所以,当所有控件的效果都运行完了之后,总共花时1.5秒。
其它
xml文件中的alpha节点还有一个经常会用到的属性android:startOffset,这个属性设定动画开始的时间,例如将这个属性值设为2000,动画将会在2秒之后执行。
创建android应用程序的偏好设定
创建应用程序设定
一款应用程序通常都需要存储一些基本的状态信息和用户数据,我们可以使用Android的Shared Preferences来实现这个功能。
在一个应用程序的所有activity中,我们都可以通过一个名称来访问Shared Preferences。因为这些设定信息是整个程序公用的,所以我们可以创建一个activity的子类(在这里举例为AppActivity),让程序中所有其他的activity继承AppActivity,我们在AppActivity中声明一个成员变量,用于标记Shared Preferencess的名称,这样一来在所有的activity中我们都可以统一地访问我们的Shared Preferencess。
// 在AppActivity中声明一个成员变量 public static final String APP_PREFERENCES = “APP_PREF”;
创建Shared preferences是没有数量限制的,所以你可以使用不同命名对应不同的类别,例如你可以分为应用设定(APP_PREFERENCES)和用户设定(USER_PREFERENCES),怎么组织Shared Preferences取决于你自己。
添加Shared Preferences到应用程序中,需要以下几个步骤:
1. 使用getSharedPreferences()方法获取一个SharedPreferences的实例
2. 创建一个SharedPreferences.Editor对象
3. 使用editor对象修改设定
4. 使用editor的commit()方法提交修改
存储特定的设定
Shared Preferences中的每个设定都是以键值对的形式存储的,值可以是以下这些类型:
. Boolean
. Float
. Integer
. Long
. String
当你决定好了要存储那些设定信息之后,你需要取得一个SharedPreferences实例并且使用Editior对象更新设定并提交修改。下面的例子中,存储了两个设定(用户名和年龄):
SharedPreferences settings = getSharedPreferences(APP_PREFERENCES , MODE_PRIVATE); SharedPreferences.Editor prefEditor = settings.edit(); prefEditor.putString(“UserName”, “JaneDoe”); prefEditor.putInt(“UserAge”, 22); prefEditor.commit();
我们还可以通过editor的clear()方法把设定清空,或者使用remove()方法,根据名称删除指定的设定。
获取应用的设定
获取Shared Preference的设定值比创建还要简单,你不需要editor对象。下面的示例展示了怎么样获取Shared Preference的设定:
SharedPreferences settings = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE); if (settings.contains(“UserName”) == true) { // 这样就可以获取key为 UserName的值了, getString()的第二个参数是当UserName没有值的时候作为默认值 String user = Settings.getString(“UserName”, “Default”); }
你可以使用SharedPreferences对象根据名称检测一个设定,获取一个强类型的设定或者 获取所有设定,通过使用map来存储他们。
使用imageMagic实现PDF转图片
最近一个项目需要实现将PDF文件转成图片的功能,由于转换时间较长,所以选择在系统后台执行转换工作,使用的是一个叫imageMagic的程序(貌似很多图片处理软件用的就是这个库)。查看imageMagic的官方文档,参数实在太多,做了一番research之后,记录如下:
PDF转图片
convert -density 300 -quality 100 -resize 1024x768 -antialias test.pdf[0-50] test.jpg
使用convert命令进行转换:
density参数是设置图片DPI值
quality参数是设置图片质量(0-100,对png格式图片无效)
resize参数是对图片进行缩放(按比例)
antialias参数是设置开启文字抗锯齿效果
test.pdf是要转换的pdf文件(必要时需要指定绝对路径,不一定是pdf格式,图片格式即可,0-50是指要转换的页码,不指定就全部转换)
test.jpg是转成图片后的名字(如果pdf有多页,图片名称按照 test-0.jpg, test-1.jpg, test-2如此类推)
PHP中调用convert命令
PHP中有几个调用系统shell命令的函数,这次项目中我使用exec这个函数,使用方法如下:
$cmd = "convert -density 300 -quality 100 -resize 1024x768 -antialias test.pdf[0-50] test.jpg"; // $output变量记录命令执行时的所有输出,以数组格式返回 // 执行后可以对$output变量进行检查,因为convert命令正常的话是没有输出的,如果有输出可能就是转换失败 exec($cmd, $output);
解析PDF等图片的信息
可以使用identify命令对PDF进行解析,可以得到文件的分辨率等信息,简单命令如下(详细参数参考官方文档):
identify test.pdf
解决在IE下jpg图片无法显示的问题
因为imageMagic转换成jpg格式图片的时候,默认使用了CMYK格式,所以导致在IE下有时候会显示不了。
可以使用colorspace参数将图片使用RGB的格式进行转换。
命令如下:
convert -colorspace RGB test.pdf test.jpg
【翻译】多文件上传

多文件上传
以往我打算是实现同时上传多个文件,会使用多个"file"表单元素,这是令人讨厌的,效率低下(译者注:用户需要一个文件一个文件地选择),但我无法想象我如果不使用它的话,我的用户会怎么样。很幸运,Safari, Chrome和firefox 现在已经实现了使用一个file表单元素就能完成完成多文件上传的方法。
查看DEMO
HTML
<form method="post" action="upload-page.php" enctype="multipart/form-data"> <!-- 译者注:注意這個multiple属性和name属性 --> <input name="filesToUpload[]" id="filesToUpload" type="file" multiple="" /> </form> <br/>
简单的给file 表单元素添加一个muliple属性就允许多文件上传了。(译者注:multiple的值的作用不清楚,原文的意思大概是可以添加验证功能)
Listing Multiple Files with JavaScript
//get the input and UL list var input = document.getElementById('filesToUpload'); var list = document.getElementById('fileList'); //清空列表 while (list.hasChildNodes()) { list.removeChild(ul.firstChild); } //遍历每一个选择上传的文件 for (var x = 0; x < input.files.length; x++) { //add to list var li = document.createElement('li'); li.innerHTML = 'File ' + (x + 1) + ': ' + input.files[x].name; list.append(li); }
file表单元素的files属性是一个数组,所以可以通过length属性可以知道用户选择的文件。可以遍历得到每一个文件的路径(path)和名称(name)。
Receiving and Handling Files with PHP
使用PHP接收并处理文件
if(count($_FILES['uploads']['filesToUpload'])) { foreach ($_FILES['uploads']['filesToUpload'] as $file) { // 你可以在处理图片 echo $file; } }
PHP根据表单的那么属性创建了一个文件数组。
当然,你也可以在IE和opera中通过flash实现多文件上传,可是想这样要另外的组件支持始终不是什么好主意。希望这些浏览器快点支持多文件上传吧!
by 译者
评论中以外发现一个flash上传的jquery插件http://www.uploadify.com/,这段时间在弄大文件上传的处理方式,是使用swfupload这个组件实现的。
记录一下这个uploadify, 以后也许用得着:)
Android开发中的单元测试
java开发好像大多都是以xml作为配置文件(php大多使用ini格式的文件),一开始真是有点不习惯,而且很多配置项给人糊里糊涂的感觉,目前只是处于复制粘贴,不知其所以然的水平。以下是在android开发中使用单元测试的配置项要点:
1.在AndroidManifest.xml中的application节点下添加如下节点:
<uses-library android:name="android.test.runner" />
2.在AndroidManifest.xml中的根节点(mainfest)下添加如下节点:
<instrucmentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.sharp.action" //这个属性必须与单元测试用例class所在的package一致
android:label="Test for My App"/>
杂碎记录
1.限制输出格式为数字(整数或浮点数)的属性
android:numeric="integer|decimal"
2.字符串转浮点型
String s = "1.2";
float f = float.parseFloat(s);
3.java中浮点型转字符串
String str = ""+f;
结束语
终于开始认真学android开发了,入门还是不难的,加油!
SQLite 的Script导出方法
如何导出sqlite的sql语句
作者:axgle
这是我实际经验的总结,是有效的。不知道有没有更简单的办法呢?
知道的朋友回复一下,谢谢.
1.选择源db_src
sqlite3 src.db
2.选择输出模式
.mode insert
3.选择输出文件名
.output sql.txt
4.开始dump
.dump table1,table2
java中的匿名类学习笔记
定义匿名类
在声明某个类的成员属性时,可以将匿名类的实例赋值给改成员变量,也可以在某个方法中,将匿名类实例作为方法返回值
case1: 赋值给类中成员变量
class Outer { public B bb = new B() { // B是匿名类的父类或者是一个接口 private int a = 1; private int b = 2; public function func(){ // do sth. } }; // 此处的分号一定要记得,因为这里是一条语句(表达式) }
case2:方法中返回匿名类的实例
class Outer { public B getAnoy(){ return new B() { // B是匿名类的父类或者是一个接口 private int a = 1; private int b = 2; public function func(){ // do sth. } }; // 此处的分号一定要记得,因为这里是一条语句(表达式) } }
向匿名函数父类的构造函数传递参数
//很简单,只要在声明匿名函数的时候传递 new B(1){ //声明匿名函数 }
方法中的匿名函数使用方法的参数
当方法的参数为final时,匿名函数才能使用该参数变量
class Outer { public B getAnony(final String param) { return new B() { private String paramHolder = param; // param必须为final } } }
匿名函数的构造函数
因为是匿名函数,那么就不可能有命名的构造函数,但是可以通过Instance initialization(实例初始化)来实现类似构造函数的效果
class Outer { public B getAnony() { return new B() { { System.out.println("初始化对象时调用") } //这样就可以实现构造函数的效果了 private int a = 1; } } }
匿名类与正常的类继承的不同
尽管匿名类可以实现某个接口,也可以扩展(extends)某个类,但是不能同时实现一个接口并扩展某个类。鱼与熊掌不能兼得。
Thinking In Java内部类中讲到匿名类时,通过匿名类巧妙地实现了工厂方法。
HTML5中的classList
HTML5的API加入了一个很有用的功能,那就是classList。
classList对象被添加在所有的DOM元素中,提供了DOM元素的class相关操作,如添加、删除等。
classList对象结构如下:
node.classList = { length: {number}, /* # of class on this element */ add: function() { [native code] }, contains: function() { [native code] }, item: function() { [native code] }, /* by index */ remove: function() { [native code] }, toggle: function() { [native code] } }
正如你所看到的,classList对象内容不多,但都是一些很有用的属性和方法。
添加一个class
myDiv.classList.add('myCssClass');
删除一个class
myDiv.classList.remove('myCssClass');
切换class
myDiv.classList.toggle('myCssClass');
检测元素是否拥有某个class
myDiv.classList.contains('myCssClass');
现在只有firefox支持classList这个对象。相信其他浏览器也会陆续支持。
PHP中设置文件上传大小限制
PHP中有三个配置项是控制上传相关的:
memory_limit
post_max_size
upload_max_filesize
其中只有memory_limit可以在脚本中动设置
ini_set(‘memory_limit’, ‘60M’); // 可成功设置 ini_set(‘post_max_size’, ‘40M’); // 失败 ini_set(‘upload_max_filesize’, ‘40M’); // 失败
还可以通过.htaccess文件设置:
php_value memory_limit 60M
php_value post_max_size 40M
php_value upload_max_filesize 40M
当然,还可以直接php.ini中配置
