mikebai.com

  • Home
  • dev
  • DotNET
  • M365
  • 搞笑
  • 杂七杂八
  • FocusDict
個人BLOG
it developer
dev

Android四种Activity的加载模式

建议首先阅读下面两篇文章,这样才可以更好的理解Activity的加载模式:   Android的进程,线程模型:  http://www.cnblogs.com/ghj1976/archive/2011/04/28/2031586.html 其中对“Android的单线程模型”的描述,明白Activity的一些注意事项。   Android Application Task Activities的关系   http://www.cnblogs.com/ghj1976/archive/2011/04/29/2032412.html  尤其要明白 Task 是啥。   一个Activty的生命周期   Activty的生命周期的也就是它所在进程的生命周期。   每一个活动( Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。   但是当一个活动的状态发生改变的时候,开发者可以通过调用 onXX() 的方法获取到相关的通知信息。   在实现 Activity 类的时候,通过覆盖( override )这些方法即可在你需要处理的时候来调用。 onCreate :当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。 onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用 onSaveInstanceState ()方法保存的状态信息。 onStart :该方法的触发表示所属活动将被展现给用户。 onResume :当一个活动和用户发生交互的时候,触发该方法。 onPause :当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。 onStop :当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。 onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。 onDestroy :当活动销毁的时候,触发该方法。和 onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。 onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。 通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。    Activity栈   上面提到开发者是无法控制Activity的状态的,那Activity的状态又是按照何种逻辑来运作的呢?这就要知道 Activity 栈。   每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。   当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部。   如果用户使用后退按钮返回的话,或者前台的Activity结束,在栈上的Activity将会移上来并变为活动状态。如下图所示:   一个应用程序的优先级是受最高优先级的Activity影响的。当决定某个应用程序是否要终结去释放资源,Android内存管理使用栈来决定基于Activity的应用程序的优先级。   Activity状态   一般认为Activity有以下四种状态:   活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活,这个将会被暂停。   暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了。有可能原因是一个透明或者非全屏的Activity被激活。   当被暂停,一个Activity仍会当成活动状态,只不过是不可以接受用户输入。在极特殊的情况下,Android将会杀死一个暂停的Activity来为活动的Activity提供充足的资源。当一个Activity变为完全隐藏,它将会变成停止。   停止:当一个Activity不是可视的,它“停止”了。这个Activity将仍然在内存中保存它所有的状态和会员信息。尽管如此,当其它地方需要内存时,它将是最有可能被释放资源的。当一个Activity停止后,一个很重要的步骤是要保存数据和当前UI状态。一旦一个Activity退出或关闭了,它将变为待用状态。   待用: 在一个Activity被杀死后和被装在前,它是待用状态的。待用Acitivity被移除Activity栈,并且需要在显示和可用之前重新启动它。   activity的四种加载模式   在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。   在android里,有4种activity的启动模式,分别为: standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。 singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。 singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。 singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。   这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置,中的launchMode属性。   相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用 Intent.FLAG_ACTIVITY_R

2012-01-14 0comments 114hotness 0likes mikebai Read all
dev

Android Application Task Activities的关系

什么是Android  Application? 简单来说,一个apk文件就是一个Application。 任何一个Android Application基本上是由一些Activities组成,当用户与应用程序交互时其所包含的部分Activities具有紧密的逻辑关系,或者各自独立处理不同的响应。 这些Activities捆绑在一起成为了一个处理特定需求的Application, 并且以“.apk”作为后缀名存在于文件系统中。 Android平台默认下的应用程序 例如:Email、Calendar、Browser、Maps、Text Message、Contacts、Camera和Dialer等都是一个个独立的Apps。   安装 Application的过程也可以简单理解为将其所包裹的Activities导入到当前的系统中,如果系统中已经存在了相同的Activities, 那么将会自动将其关联,而不会重复安装相同的Activities,避免资源的浪费。 Application卸载的过程也会检查当前所关联的 Activities是否有被其它Application标签所关联,如果仅仅是提供当前的Application使用,那么将会彻底被移除,相反则不做 任何操作。   就像我们已经知道的,Application基本上是由四个模块组成:Activity、Service、Content Provider 和 Broadcast Receiver,其中Activity是实现应用的主体。   什么是 Activity Stack? 操作应用程序时,有时需要调用多个Activities来完成需求,例如:发送邮件程序,首先是进入邮件主界面,然后启动一个新的Activity用于填写新邮件内容,同时可以调出联系人列表用于插入收件人信息等等。在这个操作过程中 Android平台有一个专门用于管理Activities堆栈的机制,其可以方便的线性记录Activities实例,当完成某个操作时,可以通过导航功能返回之前的Activity(通过按操作台的“Back”按钮)。 每次启动新的Activity都将被添加到Activity Stack。用户可以方便的返回上一个Activity直到Home Screen,到达Home Screen后,将无法再继续查看堆栈记录(俗话说:到头了)。如果当前Task被中止(Interrupting the task),返回到系统主界面后启动了其它操作,当希望返回到前一个Task继续执行时,只需要再次通过主界面的Application launcher或者快捷方式启动这个Task的Root Activity便可返回其中止时的状态继续执行。 相对于Views、 Windows、Menus和Dialogs而言,Activity是唯一可被记录在History stack中的数据,所以当你所设计的应用程序需要用户由A界面进入到次一级界面B,当完成操作后需要再次返回A,那么必须考虑将A看作为 Activity,否则将无法从历史堆栈中返回。   什么是Task 当我们需要一个Activity可以启动另一个Activity,可能另外一个Activity是定义在不同应用程序中的Activity。 例如,假设你想在你的应用中让用户显示一些地方的街景。而这里已经有一个Activity可以做到这一点,因此,你的Activity所需要做的只是在 Intent对象中添加必要的信息,并传递给startActivity()。地图浏览将会显示你的地图。当用户按下BACK键,你的Activity会再次出现在屏幕上。 对于用户来说,看起来好像是地图浏览与你的Activity一样,属于相同的应用程序,即便是它定义在其它的应用程序里,并运行在那个应用程序的进程里。 Android通过将这两个Activity保存在同一个Task里来体现这一用户体验。简单来说,一个Task就是用户体验上的一个“应用”。 它将相关的Activity组合在一起,以stack的方式管理(就是前面提到的Activity Stack),这就是Task。 在Android平台上可以将task简单的理解为幽多个Activity共同协作完成某项应用,而不管Activity具体属于哪个Application, 通过下图可以更清晰的理解Application、task、Activity三者之间的关系:   Task 有啥用? 我们用过Android的手机就会知道有下面的场景: 假设我们首先在用IReader在看书,从选书到具体书的阅读界面,这是有好几个Activity。我们每一个点击的Activity都被放在阅读这个Task对应的Activity Stack中了,这可以放我们通过回退键返回每一个前面的Activity。 我们在阅读到一半时,想看看Sina微博,按Home键离开了IReader。 在Sina微博界面也是有多个Activity,我们一步到阅读界面。这时候我们每一个点击的Activity都被放在Sina微博这个Task对应的Activity Stack中了,这可以放我们通过回退键返回每一个前面的Activity。 我们这时候再回到IReader读书界面,原先的状态还是保留的。 显然每一个Task有自己的 Activity Stack。 Task就是这样为了方便人们使用手机而设置的,就像前面提到的场景Task可以跨Application。   下面这个图从另外一个角度描述了Application Task Activities的关系   Task通过Application launcher、Home screen的快捷方式或者 由 “Recent Tasks”(长时间按住Home键)最近使用过的Task记录中启动。 当从一个Activity中启动另外一个Activity时,Back键将作用于返回前一个Activity,与此同时 新开启的Activity将被添加到Activity Stack中。 有关更详细的可以参看这篇文章: [译]关于Activity和Task的设计思路和方法 http://blogold.chinaunix.net/u2/85193/showart_1966109.html   参考资料:

2012-01-14 0comments 109hotness 0likes mikebai Read all
dev

解决eWebEditor编辑器在火狐浏览器不能兼容的问题

1 在火狐浏览器里 点 工具-附加组件-获取附加组件,输入IE TAB,安装一个IE tab插件,装好了重启。 2 在Firefox无法正常显示的网页上,右键点击标签页,选择“切换浏览器”,然后Firefox就切换到IE内核的浏览器了,这样既使用的Firefox,又有IE的兼容性。

2012-01-14 0comments 93hotness 0likes mikebai Read all
dev

Android的七巧板Activity之三 Activity的归属(原文作者禁止转载)

2012-01-11 0comments 98hotness 0likes mikebai Read all
dev

对android的android:taskAffinity初识

android中AndroidManifest.xml文件, activity标签中有一个属性为android:taskAffinity=“String”。 如果不设置此属性,默认一个应用程序只有一个栈,这个栈以应用包命为单位。 下面是我做的三个实验: 1、新建两个工程,application01和application02 application01设置 android:taskAffinity="aaa.aaa" android:allowTaskReparenting="true" application02也设置 android:taskAffinity="aaa.aaa" android:allowTaskReparenting="true" 先运行application01,然后点击home键,让application01运行在后台,再运行application02,现在按返回键,当前显示的是application01的mainActivity,再点返回键,回到home页。 但是长按home键,发现运行过的程序只有application01。   2、紧接着又在此基础上做了另外一个实验,在application01上新建一个secondActivity,设置 android:taskAffinity="aaa.bbb" android:allowTaskReparenting="true" 在mainActivity中startActivity时,设置Intent中flag属性为FLAG_ACTIVITY_NEW_TASK,注意,这里的flag属性必须为new task。 然后运行application01,点击进入secondActivity,点击home键,让程序回到后台, 然后运行application02,点击返回,当前显示的application01中的mainActivity,再点击返回,显示的是application01中secondActivity,跟预期一致。 3、在此基础上堆application01再次修改,增加thirdActivity,设置属性android:taskAffinity="aaa.aaa" android:allowTaskReparenting="true" 并在secondActivity中startActivity时,设置Intent中flag属性为FLAG_ACTIVITY_NEW_TASK; 运行application01,点击进入secondActivity,再进入thirdActivity,点击返回,回到mainActivity,在点击返回,回到secondActivity,再点击返回,回到home页面,跟预期一致。

2012-01-11 0comments 97hotness 0likes mikebai Read all
dev

android Activity类的使用

今天我谈谈Activity这个类吧(对于开发环境的一些配置情况,请大家参看google发布的那个文档吧,那里已经写得很清楚了,各种工具的下载链接也都很齐全),以后我还会陆续发表一些文章贡大家参考(我的QQ:83961879,加我时注明android). 在android开发中Activity非常重要,在一个应用中,每一个显示的屏幕都是一个Activity.所以学习android,必须要对Activity有一定的了解.在其他论坛中也有一些关于Activity的介绍,我在这里就想谈谈我对Activity学习的一些看法.首先Activity的生命周期很重要,Activity主要包含六个方法,分别是onCreate,onStart,onResume,onPause,onStop,onDestory. onCreate和onDestory对应.onStart和onStop对应,onResume和onPause对应. 这几个函数大概是这样定义的,当启动一个Activity的时候,onCreate方法首先会被启动,然后接着是onStart和onResume,也会启动,一般地,等这几个函数都启动完了之后你这个Activity就可以被显示出来了.当然我这里说的是一般的情况,如果你要是在这三个函数初始化的时候启动了一个后台的Service,那么还要等待ServiceConnection执行完毕才能够被显示出来,这里可能有人要问什么是Service了,在以后我会介绍它,这里大家就先了解下Service的回调函数也会影响Acitivity的启动就可以了.这是Activity启动时会调用的三个函数,在Acitivity销毁的时候会调用onPause,onStop,onDestory.当调用完onDestory之后,你的Acitivity也就被销毁完毕了,这时候你在调用Activity的isFinishing的时候,就会返回true,但是此时Activity的this指针还可以被使用,如果你在Activity单起一个线程做其他事情的话,那么上下文变量context指针还是能够被使用的.      当然Activity有可能还处于其他状态,不一定就是被显示或者被销毁,很有可能这个Activity启动了另一个Activity,这个时候前先的那个Activiy就会被放到系统的堆栈中,等被启动的Activity返回的时候,它又重新被显示出来,这个流程是这样的,一个Activity启动了另外的一个Activity,那么它就会调用onPause函数,进入一种停滞的状态,然后被启动的Activity被销毁返回后,又会调用onResume函数.对于Activity的这种机制,我感觉在初始化的工作最好放到一个自己定义的一个接口中,因为由于Activity状态的改变,你的Activity的Layout就有可能会被改变.说到这里就要谈一下什么叫做Layout,每个Activity的界面的布局就是一个Layout,每个Activity都要有这样一个布局它才能够被显示出来,一般地,我们都会把一个Layout放到一个XML文件当中,然后直接调用Activity的setContentView函数来填充这个Activity,如果Layout不放在xml文件中,也可以用代码生成一个动态的Layout,也就是说用Activity.this指针生成一个Layout.这个给大家推荐一个非常好用的工具叫做droiddraw,论坛里就有链接,站长好像发过贴.这个工具非常好用,不用看教程半小时就能学会,上面有一些特定的控件,把控件摆好布局后直接能生成xml文件.把这个xml文件放到项目的res/layout文件夹下面就可以了.生成好Layout文件后,你就要为你程序要用到的一些控件设定ID,具体怎么设定大家可以在google的android主页里有,叫gettingstarted,那个写得很明白,我就不跟这里重述了.接下来还是谈下android的这几个主要的函数,我还有些建议就是在onCreate函数中尽量少写代码,把尽肯能多的东西放到onResume和那个自定义的初始化函数里去写,onResume这个函数被调用的几率是非常高的,这里大家在模拟器上开发可能没有感觉到onResume的重要性,在真机上测试就会发现,当屏幕变黑进入等待状态,然后你手动恢复屏幕变亮时也会进入onResume状态,所以我感觉把一些刷新控件的方法放到onResume函数中来做还是非常必要的.onPause,onStop,还有onDestroy函数都是用来做一些清理工作的,比如说一些变量要被释放,一些线程要被停滞等等都可以放到这里来做. 下面我来总结一下Activity一个大概的设计思路: 首先设计一个方法,这个方法主要作用就是初始化Activity的控件,进行各种条件判断,对Acitvity来进行不用的布局初始化,这里举个例子来解释下为什么要初始化不同的布局,例如你的这个Activity从SD卡读取了一些信息,那么当你拔出SD卡的时候这些信息肯定也就没有了,那么你就要进行另外的一个布局来显示这个Activity,这个时候你就可以重用这个函数来进行布局的初始化. onCreate函数:注册你要用到的变量,比如说service,receiver,这些变量是无论你的Activity是在前台还是在后台都能够被响应到的,然后调用上面那个用来初始化的函数初始化布局信息. onStart函数:注册一些变量.这些变量必须在Activity在前台的时候才能够被响应. onResume函数:调用一些刷新UI的函数,每当Activity调用到这里时就要刷新一下UI各控件的状态. onPause函数:一般是做一些变量的设置,因为这个时候Activity马上就要切到后台处理,可能有些变量就要被释放掉或者状态要做些相应的调整. onStop函数:反注册在onStart函数中注册的变量. onDestory函数:反注册在onCreate函数中注册的变量. 上面谈了些Activity的最常用的一些方法,当然还有很多方法没有谈到,有很多方法我也没有用过,其他方法大家可以参考google的文档. 接下来我来谈谈Activity中最简单的一些通信方法,这里我先定义两个名字为方便接下来的叙述,启动另外一个Activity的那个Activity我们称之为主Activity,被启动的那个Activity我们称之为子Activity. 主Activity和子Acitivity通信的方式有很多种这里介绍两种最简单的方法。 方法一:通过Intent来进行参数的传递,在Intent中有各种putXXX方法来存放各种参数,然后在子Activity接收到这个Intent时能够从这个Intent里取出这个参数,利用getIntnet().getXXXExtra()方法就可以了. 方法二:当一个主Activity想从一个子Activity接受消息时可以使用StartActivityforResult方法,例如这样启动一个Activity,startActivityForResult(i, REQUEST_CODE); 然后在主Activity中的onActivityResult方法对requestCode进行判断来对子Activity不同的返回处理不同的情况,另外子Activity也可以利用setResult方法来设置主Activity方法中的resultCode,这样主Activity也可以根据子Activity的不同的resultCode来处理不同的情况. 今天就先写这么多吧,有什么问题大家加我QQ,可以详谈. 我在补充两句:现在android好像很少有中文资料,一般都要看google的英文文档来学习, 如果你要是对java理解比较深的话,那么我觉得android应用程序还是很容易上手的.

2012-01-08 0comments 112hotness 0likes mikebai Read all
dev

Android Activity生命週期簡介

前面有提到何謂Activity: 最簡單的就是把Activity看成一個User Interface Program. 它會提供使用者一個互動式的介面功能. 當然一個activity通常不只一個UI, 所有的Activity在系統裏由Activity stack 所管理, 當一個新的Activity被執行後,它將會被放置到stack的最頂端,並且變成"running activity", 而之前的Activity原則上還是存在stack中,但不會是在foreground(前景)的情況. 一個Activity基本上有四個狀態 Active, Paused, Stopped, Dead: Active (活動):Active狀態是使用者啟動Application 或 Activity 後,Activity 在運行中的狀態.在 Android 平台上, 一個時刻只會有一個 Activity 處於Active 或 Running 狀態。其他的 Activity 都處於未Dead, Stopped 或是Paused 的狀態. Paused (暫停)Paused狀態是當 Activity 暫時暗下來, 退到背景畫面的狀態. 例如當電話來時, 原本運行的 Activity 退到背景畫面. 新出現的介面元件蓋住了原來的 Activity 畫面.Activity 處在Paused狀態時, 使用者無法與原來的 Activity 互動. Stopped (停止)Stopped狀態是有其他 Activity 正在執行, 而這個 Activity 已經離開螢幕, 不再動作的狀態.透過長按Home鍵, 可以叫出所有處於Stopped狀態的Application List(應用程式列表).在Stopped狀態的 Activity,還可以透過 Notification 來喚醒。以後再說明 Notification. Dead/Inactive (已回收或未啟動)Dead狀態是 Activity 尚未被啟動, 已經被手動終止, 或已經被系統回收的狀態.要手動終止 Activity, 可以在程式中呼叫 finish 函式.如果是被系統回收, 可能是因為記憶體不足, 系統根據記憶體不足時的回收規則, 將處於Stopped狀態的 Activity 所佔用的記憶體回收. 下面的流程圖說明一個Activity運行的情況, 長方形代表callback methods(回呼函式), 可以做出想要處理的事情, 有顏色的部份就是實際Activity會處於的狀態. 上圖有三個主要 lifetime : 1. Entire lifetime: 一個Activity的Entire lifetime是由onCreate()開始, 一直到onDestroy()結束.一個Activity可以把所有的資源設定寫在onCreate中, 一直到onDestroy()時再釋放出來. 2. Visible lifetime: 一個Activity的Visible lifetime是指在onStart()到onStop()之間. 在這段時間內,使用者可以在螢幕上看見Activity, 要注意這個"Visible"是個形容, Activity不見得一定在foreground(前景)跟使用者直接互動. 3. Foreground lifetime: 一個Foreground lifetime 指 onResume() 到 onPause() 之間. 這個時期的Activity是在其他的Activity的前面, 且可以直接跟使用者進行互動. 所以這段時期指的就是圖中的Activity is running. 簡單的總結幾個動作:onCreate()用來做程式的初使化動作; onDestory()通常都拿來把onCreate()時的資料做釋放的動作;onPause()時把需要保存的資料保存; onResume()把保存的資料拿回來使用. 再歸納一般 Android Application遵循的動作流程: 一般啟動:onCreate -> onStart -> onResume 啟動一個 Activity 的基本流程是: 分配資源給這個 Activity(onCreate), 然後將 Activity 內容顯示到螢幕上(onStart), 在一切就緒後, 取得螢幕的控制權(onResume), 使用者可以開始使用這個程式。 呼叫另一個 Activity: onPause(1) -> onCreate(2) -> onStart(2) - onResume(2) -> onStop(1) 先凍結原本的 Activity, 再交出直接存取螢幕能力(onPause )的過程. 直到 Activity 2 完成一般啟動流程後, Activity 1 才會被停止. 回復原 ActivityonPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) -> onDestroy(2) 按 Back鍵可以回到原本的 Activity。 退出/結束onPause -> onStop -> onDestroy 如果程式中有直接呼叫 finish 函式來關閉 Activity的話, 系統會暫停(Pause), 停止(Stop)然後銷毀(Destroy)。 回收後再啟動 onCreate -> onStart -&g

2012-01-07 0comments 115hotness 0likes mikebai Read all
dev

Photoshop初级教程:凹凸文字效果

本Photoshop初级教程详细讲解如何用Photoshop制作凹凸文字效果,涉及到了的图层混合选项,特别适合Photoshop初学者和新入行的设计师。 这篇Photoshop初级教程教一些新的设计师朋友如何简单轻松制作一个漂亮的凹凸文字效果(inset text effect),又叫凸版印刷(letterpress)文字效果。下图是最终效果: 1.创建Photoshop文档 首先创建一个Photoshop空白文档。打开Photoshop,按Ctrl+N新建文档,这里我们用小画布,设成550px×550px,当然可以随时调节画布大小。 2.制作背景图片 1)我们要创建一个用渐变做的背景。新建图层,或者将原来的背景图层解锁(只要双击原来的背景图层),接着弹出如下图的对话框,将它名字改成background,点击确定。 2)双击刚才的背景图层,打开Photoshop图层混合选项。用图层混合选项做渐变比直接用Photoshop渐变工具要方便许多,而且可以很容易地更改效果。 我们想要创建一个从亮到暗的垂直渐变,参考颜色:亮蓝(#448CCB),暗蓝色(#003471)。如下图: 点击颜色条,弹出如下图的选择颜色的对话框,选择我们的参考颜色,你可以通过拉动中间的滑块控制明暗的比例。 3)渐变完成了,但色彩不够丰富,我们要为背景增加一盏“灯”来丰富色彩。 选择Photoshop的画笔工具,选择一个大的笔刷,降低硬度、透明度和流量(如果你有数位板更好控制),如下图: 按住Ctrl+Shift+N来创建一个新的图层,命名为background light。将前景色设为白色,用笔刷在左上角点击。效果如下图: 3.创建凹凸文字 1)用Photoshop的文字工具创建一些示例文字,选择一些比较粗的字体效果会更好。而且文字尺寸也要大一些,这里设置成30px(Photoshop默认文字单位是pt,可以通过选项更改成px)。 2)现在我们要将文字和Photoshop画布对齐起来(译者:令我惊奇的是,很多使用经常使用Photoshop的人甚至不知道如何对齐。) 确保先选择文字图层,然后按Ctrl+A选中所有,接着到Photoshop菜单 :图层(Layer) >对齐图层( Align Layers to Selection) > 垂直居中(Vertical Centers),垂直对齐后,在同样菜单下点水平居中(Horizontal Centers)。或者可以直接点击Photoshop菜单栏下的几个对齐图标,这样操作更快捷。 3)下面我们开始为文字做凹凸效果,同样还是用Photoshop的图层混合选项。这里会用到三种效果:投影、内阴影和渐变叠加。双击文字图层进入Photoshop图层混合选项。 打开Photoshop图层混合模式后先在左边选中渐变叠加,同样我们要让文字也从上到下逐渐变暗,同时文字的颜色整体上要比背景稍

2012-01-03 0comments 95hotness 0likes mikebai Read all
dev

au is01日文版 市场打开错误

去设置里面把市场卸载. 「設定  -->  アプリケーションの管理  -->  マーケット→マーケット  -->  アンインストール」 即可还原成原始的市场app.打开后问题解决

2011-12-23 0comments 97hotness 0likes mikebai Read all
dev

远程主机强迫关闭了一个现有的连接,Connection attempts...

最近eclipse插上真机老是出下面的错误. 远程主机强迫关闭了一个现有的连接,Connection attempts...Adb connection Error 网上说的adb kill-server 然后再adb start-server 再重启eclipse.貌似很多都是转来转去的. 试了几次,发现我问题依旧.. 咕咕噜了一下,发现用下面文章提到的patch adb的方法可以解决发上来希望对大家有所帮助吧 http://code.google.com/p/android/issues/detail?id=12141 文章里面有2个下载链接,第一个稍旧 1.0.26 version (实测可正常使用)http://android.googlecode.com/issues/attachment?aid=8293722374312378755&name=adb.exe&token=DuX2HnbOsaAt_F251Ak_t31Q1RI%3A1324311316026version of adb (1.0.29) --诺顿提示需要注意http://android.googlecode.com/issues/attachment?aid=121410050000&name=adb.exe&token=BQatcvFvTG-erMhohbajbbRAP3M%3A1324311316037 下载后覆盖android-sdk\platform-tools原来的adb.exe文件即可  

2011-12-20 0comments 103hotness 0likes mikebai Read all
1…3233343536…62

Recent Posts

  • c# winform适配高dpi
  • com.microsoft.sqlserver.jdbc.SQLServerException “trustServerCertificate”属性设置为“false”,但驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server建立安全连接
  • java -cp 用法介绍
  • HTML 容器元素
  • MVC的cshtml的介绍

Recent Comments

No comments to show.

COPYRIGHT © 2025 mikebai.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang