第一步:制作证书 1)打开 Finder->应用程序->实用工具 -> 钥匙串访问
2)单击:"钥匙串访问"选择 "证书" 再选择"创建证书"过程如下图:
注意:证书名称必须填写为 iPhone Developer
第二步:修改XCode配置文件 注:如遇到文件无法解锁没有权限不能修改,可以复制一份出来,修改好之后将原来的替换掉
1)修改SDKsettings.plist文件 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk
打开该目录下的SDKSettings.plist文件,把CODE_SIGNING_REQUIRED和ENTITLEMENTS_REQUIRED的值改成NO
2)修改Info.plist文件 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/
用XCode打开该目录下的Info.plist文件,右击--Add Row,增加两项:
PROVISIONING_PROFILE_ALLOWED 值为 NO
PROVISIONING_PROFILE_REQUIRED 值为 NO
3)将上面Info.plist文件中的 "XCiPhoneOSCodeSignContext" 替换成 "XCCodeSignContext"(共3处) 如果不进行此步,编译Device Release版本时會报错:
1. Code Sign error: a valid provisioning profile matching the application’s Identifier ‘com.yourcompany.xxxx’ could not be found
第三步:设置gen_entitlements.py脚本权限 注:如果你的电脑联网了,那么执行1)的命令后会在相应的目录自动创建iphoneentitlements文件夹及其下的gen_entitlements.py文件,如执行后没有生成指定文件,请重复执行下面的命令或者换第二种方法,两种生成脚本文件的方法任选一种。
1)在终端执行如下命令:
mkdir /Applications/Xcode.app/Contents/Developer/iphoneentitlements
cd /Applications/Xcode.app/Contents/Developer/iphoneentitlements
curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
mv gen_entitlements.txt gen_entitlements.py
sudo chmod 777 gen_entitlements.py
2)上面的命令执行成功之后,会在/Applications/Xcode.app/Contents/Developer/目录下生成一个iphoneentitlements文件夹和其下的gen_entitlements.py文件,如果你的电脑没有联网或者不能自动生成相关目录文件,那么需要手动在相应的目录创建指定的文件,随后需要给gen_entitlements.py设置权限。
gen_entitlements.py脚本文件的内容如下:
#!/usr/bin/env python
import sys
import struct
if len(sys.argv) != 3:
print "Usage: %s appname dest_file.xcent" % sys.argv[0]
sys.exit(-1)
APPNAME = sys.argv[1]
DEST = sys.argv[2]
if not DEST.endswith('.xml') and not DEST.endswith('.xcent'):
print "Dest must be .xml (for ldid) or .xcent (for codesign)"
sys.exit(-1)
entitlements = """
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>%s</string>
<key>get-task-allow</key>
<true/>
</dict>
</plist>
""" % APPNAME
f = open(DEST,'w')
if DEST.endswith('.xcent'):
f.write("\xfa\xde\x71\x71")
f.write(struct.pack('>L', len(entitlements) + 8))
f.write(entitlements)
f.close()
在终端给gen_entitlements.py设置权限(可能会要你输入密码)
sudo chmod 777 /Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py
第四步:修改项目属性 1)点击项目图标,找到"Build Settings"选项下的"Code Sign Identity",将其值全部改为"Don't Code Sign"
2)切换到Build Phases选项,点击右下角的Add Build Phase,然后单击Add Run Script,然后在Run Script中输入以下脚本:
export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ] || [ "${PLATFORM_NAME}" == "ipados" ]; then
/Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi
测试真机调试:
创建一个Page-based Application工程,修改Build Settings和Build Phases下面的相关配置(参考第四步)
1)选择你的设备
2)随便拖一个button,然后点击运行(Run)
3)iphone运行效果截图
如果你在寻找一种新途径,在乘坐交通工具上下班、晨跑或是健身的同时也能找点乐子的话,iOS或安卓用
户不妨试试这个新的免费应用:Umano。Umano背后的理念简单之极,然而令人惊讶的是在此之前居然无人能想到。Umano拥有专业的配音团队,专门录读来自各类热门网站或网络杂志上的文章。这一将播客和有声读物元素加入到高速发展的博客和在线文章中去的方式,极具意义
首先用户可以注册一个帐户来创建播放列表,并管理最喜欢的文章,当然,即使没注册,也能完整使用该应用程序。注册账户的方式可以是通过登陆Facebook授权使用账户,或者用邮箱新注册一个。创建播放列表的真正优势在于可以离线播放,特别适用于在上下班或健身锻炼的时候收听新闻等。
注册账户后(可直接跳过),用户可以根据文章的受欢迎程度或主题内容来浏览。菜单的第一部分包含最受欢迎文章、播放列表以及收藏文章(或标书签的文章)三个部分,第二部分设有6个主题(或兴趣方向):娱乐,不可不知,极客,商业,创意,科学。用户可以从浏览最受欢迎文章开始,最受欢迎排行榜包含来自《福布斯》、《每日科学》、Flavorwire网站、Lifehacker网站以及《纽约客》等其他知名网站上的文章。
点击想听的文章随即开始播放,每篇文章都附有原文链接,可通过自带浏览器查看。同时附有文章出处(换句话说,附有原文网站),这样能够让读者从源网站上轻松阅读更多文章。另外,用户可以轻松把Umano上的文章一键共享至Twitter,Facebook,Google+上,也可通过电子邮件分享。用户也可通过点击文章旁的“喜欢”图标来收藏该文章。
双击所朗读的文章即可添加该文章至播放列表,此时文章具有离线收听功能。首次访问添加了文章的播放列表时,可选择自动下载音频供离线收听,或关闭自动下载功能,用户可根据需要在应用程序的设置中对此项进行更改,同时可设定仅在WiFi连接状态下下载音频。
该应用的设置中还包括自动播放网站上的下一篇文章,接受每日提醒信息以及自动分享“喜欢”文章或正在收听的文章至Facebook好友等设置选项。
该应用程序最为重要的特点即能够收听文章,因其采用真人朗读而不是靠机器发声,与收听播客的方式无异。如此,无论读者兴趣何在,都可以像享受有声读物那样收听喜爱的在线资源。此外,用户在欣赏Umano上朗读的文章同时,无需担心非得在智能手机屏上四处寻找文章的来源网站或杂志名称,因为每篇文章的首段介绍中,都包含了来源信息,这一做法尤其值得称赞。
Umano上的文章来源相对固定,一般都来自最热门的网站或杂志。用户也可利用Umano这一特征来搜索文章和信息。目前尚不完全清楚每一站点中的文章是通过何标准选择至Umano的。
当然,Umano的用户体验中依旧存在微小瑕疵。但应用本身设计得流畅直观,更重要的是听觉体验令人愉悦。在这一点上,很难想象在没有使用Umano的日子里,上下班的时间是有多难熬。
你觉得Umano如何?在评论中告诉我们吧。
原文:Nancy Messieh 编译:伯乐在线 – 肖翔
【非特殊说明,转载必须在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】
【前言】对于一款应用而言,除了程序健壮之外,就是用户体验要好了。用户体验是更为直观的展现和吸引用户的手段,一方面是要符合用户的操作习惯,另外就是要有让人愉悦的界面。纵观市面上的应用,无不是在这几方面下功夫。使用动画是让应用变得更绚丽的重要手段,当然,是适度合理的使用动画。从早前的Android版本开始,系统就提供了两种动画,补间动画(Tween)和帧动画(Frame),Android3.0后又提供了属性动画(Property)。结合canvas和camera的使用,我们就可以实现各种各样的动画效果了(甚至伪3D效果)。
先说说补间动画,补间动画和帧动画都是应用于View及其子类(widget)的动画,其原理是在View绘制过程中应用各种变化效果(平移/缩放/旋转/渐变),View本身在播放动画过程中和结束后其属性并没有改变,你可以理解为“障眼法”,至于更为详细的动画播放原理,大家可以多了解了解源码中View的绘制机制,这里不解释了。
补间动画有两种实现方法,硬编码和读取XML文件。
硬编码就是在编码中使用Anamation抽象类的几个具体实现类TranslateAnimation,RotateAnimation,AlphaAnimation,ScaleAnimation。从类名就可以看出,这几个实现类分别对应了补间动画的4个效果,当然,更多时候我们需要结合这几种动同时播放的时候,就要用到AnimationSet这个类。
因为这几种都是继承于Animation这个基类,所以我们先了解下Animation的几个重要属性:
1.duration 动画持续时间,由于补间动画本质上来说是一种变化效果,所以持续时间就是这种变化效果的时间,在编码中,我们通过setDuration()来设置;
2.interpolator 动画速率变换器 结合这个变换器动画可以做出各种不同的效果,比如先快后慢(默认)的播放,匀速播放,以及更为复杂的反弹播放等;
@android:anim/accelerate_interpolator: 越来越快
@android:anim/decelerate_interpolator:越来越慢
@android:anim/accelerate_decelerate_interpolator:先快后慢
@android:anim/anticipate_interpolator: 先后退一小步然后向前加速
@android:anim/overshoot_interpolator:快速到达终点超出一小步然后回到终点
@android:anim/anticipate_overshoot_interpolator:到达终点超出一小步然后回到终点
@android:anim/bounce_interpolator:到达终点产生弹球效果,弹几下回到终点
@android:anim/linear_interpolator:均匀速度。
3.stratOffset 播放时间偏移 这个属性在几个动画联合播放的时候更多用到,主要是播放的时间先后顺序。
而start,cancel方法则是对外的接口。
而作为实现类,TranslateAnimation等除了以上的几个基本参数外,还有各种播放动画需要的参数,比如平移动画的起始位置和结束位置,缩放动画的X,Y轴缩放位置等这些都是通过实现类的构造注入的;比如
RotateAnimation (float fromDegrees, float toDegrees)
TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
AlphaAnimation(float fromAlpha, float toAlpha)
ScaleAnimation (float fromX, float toX, float fromY, float toY)
在设置了这些动画的属性后,我们就可以应用于View上来播放动画效果了;看代码
img = (ImageView) findViewById(R.id.img); Animation translate = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 100, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 100); translate.setDuration(2000); img.startAnimation(translate);
上面是平移动画的一个简单实现,有几个地方值得注意,首先我们说过补间动画是应用于View的,所以设置动画和播放动画的都是由View来完成的,其次构造函数的几个动画参数中,除了平移的初始坐标以及完成坐标外,还有几个参数是相对位置的类型(分为绝对位置类型,相对于自己位置和相对于父控件位置),如果不设置这几个类型的话,都是默认为相对于自己位置的。最后就是要设置动画的持续时间。
说道动画的位置我们有一点要明白,Android的原始锚点是在屏幕的左上角(即X,Y轴的0,0点),往下Y正,往右X正,反之亦然。所以在表示起始位置和结束位置的时候,我们除了可以用绝对的位置坐标之外,还可以用诸如100%,0%p,-100%p来表示:
再看看渐变动画,渐变动画只有起始alpha值和结束alpha值两个参数,0代表完全透明,1则是完全不透明。
img = (ImageView) findViewById(R.id.img); animation = new AlphaAnimation(0, 1) ; animation.setDuration(2000); img.startAnimation(animation);
下面是缩放动画,缩放动画的参数里面,起始大小1代表本身View的大小,0代表不可见,2即代表了2倍于原始的大小
img = (ImageView) findViewById(R.id.img); animation = new ScaleAnimation(1, 2, 1, 2, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0); animation.setDuration(3000); img.startAnimation(animation);
最后是旋转动画
img = (ImageView) findViewById(R.id.img); animation = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF, 1.0f); animation.setDuration(3000); img.startAnimation(animation);
应用这四种动画并不难,重要的是理解每个参数的意义,特别注意一下伸缩模式和伸缩值的实际作用。
说完了硬编码方式实现补间动画,另外一种实现方式就是读取XML文件实现动画了,这个在平时项目中也用的较为频繁,我们在XML文件里定义好动画的属性和顺序,然后在编码中读取播放之。
<set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="50" android:fromYDelta="0" android:toYDelta="100" android:duration="2000" android:interpolator="@android:anim/accelerate_interpolator"/> <rotate android:fromDegrees="0" android:toDegrees="90" android:duration="2000" android:startOffset="2000"/> </set>
如上图所示,在XML文件里设置好一个动画集合,集合里可以包括我们上面提到的4种动画的任意一种或多种。
animation = AnimationUtils.loadAnimation(this, R.anim.myanim); img.startAnimation(animation);
说道AnimationSet,我再补充一下硬编码中播放动画集合的实现,通过AnamationSet可以组合多种动画效果,达到和上面XML读取动画集合的效果:
AnimationSet set = new AnimationSet(false); // 设置平移动画的起始位置和结束位置 TranslateAnimation trans = new TranslateAnimation(0, 100, 0, 100); // 设置平移动画的持续时间 trans.setDuration(2000); // 将平移动画加入到集合 set.addAnimation(trans); // 设置旋转动画的起始角度和结束角度 RotateAnimation rotate = new RotateAnimation(0, 90); // 设置旋转动画的持续时间 rotate.setDuration(2000); // 设置旋转动画的播放延迟(设置成2000表示旋转动画在前面的平移动画结束后才开始播放) rotate.setStartOffset(2000); // 把旋转动画加入集合 set.addAnimation(rotate); // 播放动画 img.startAnimation(set);