首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

iOS开发那些事-iOS应用本地化-文本信息本地化

文本信息本地化在本地化工作中占有很大的比例。包括了:应用名称本地化、系统按钮和信息本地化,以及静态文本信息本地化。 系统按钮和信息本地化 还记得天气预报应用背后的“完成”按钮吗,它在中文环境下是“完成”,在英语环境下是“Done”。 还有一些系统给我们的提示信息,连接蓝牙设备时的系统提示。它在中文环境下是中文提示,在英语环境下是英文提示。 系统按钮上的文本和系统提示信息的文字我们都是不能修改的,但是如果我们不进行本地化的设置,即便是这些基本信息也一直都是英文显示。我们可以尝试在故事板中创建画面,在导航栏中放置两个系统按钮Done和Edit。然后分别在英文和中文环境下运行看看是否有变化。 事实上,它们一直都没有变化,这是什么原因?原因在于我们没有对工程本进行地化设置,打开工程中的PROJECT选择L10N,点击Localizations下面“+”,弹出菜单选择“Chinese(zh-Hans)”,这样就添加了简体中文本地化文件。 这样我们的工程就同时支持中文和英文的本地化了,系统按钮和提示信息等也都已经实现本地化了,这个过程不需要编写代码。 应用名称本地化 应用程序名称本地化是一个很重要的问题,左图是中文语言环境下的iPod touch桌面,右图是英文语言环境下的iPod touch桌面。我们会看到日历、地图、股市等几个应用名称都有本地化。 我们要编写一个应用它的英文名是:“Localization”,中文名是:“本地化”。打开工程L10N应用,找到工程中的L10N-Info.plist文件,该文件是工程属性文件,应用程序名称就是在这个文件中定义的,但是我们不能在这里本地化,要想本地化必须借助于另一个文件InfoPlist.strings,InfoPlist.strings是可以本地化的。在上一节系统按钮和信息本地化后,InfoPlist.strings下面会有两个文件:InfoPlist.strings(English)和InfoPlist.strings(Chinese)。打开Finder看到en.lproj和zh-Hans.lproj,它们的目录结构如下: ├── en.lproj │ ├── InfoPlist.strings │ └── MainStoryboard.storyboard └── zh-Hans.lproj ├── InfoPlist.strings └── MainStoryboard.storyboard CFBundleDisplayName和CFBundleName的键能够配置应用名字,CFBundleDisplayName键配置应用显示的名字。CFBundleName配置应用短名字,不超过16字符,显示菜单栏和应用窗口信息中。 InfoPlist.strings(Chinese)文件的内容如下: CFBundleDisplayName="本地化"; CFBundleName="本地化"; InfoPlist.strings(English)文件的内容如下: CFBundleDisplayName="Localization"; CFBundleName="L10N"; 运行结果,图标下文字显示的是CFBundleDisplayName键配置的名字。 程序代码输出的静态文本本地化 应用中的静态文本都应该实现本地化,但是它们可能是通过程序代码输出,也可能是通过IB在nib或故事板设计输出的。采用“Tabbed Application”工程模板创建的标签应用程序,它的两个标签上的标题First和Second,以及画面中的文字都属于静态文本。 同样都是这个工程如果在创建过程中分别创建基于故事板和nib技术的两个版本,故事板版本的两个标签上的标题是通过IB在编写在故事板文件中的(关于故事板和nib中静态文本的本地化我们会在下一节介绍)。但在nib版本中两个标签上的标题通过程序代码输出的。FirstViewController.m中的构造方法: - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = NSLocalizedString(@"First", @"First"); self.tabBarItem.image = [UIImage imageNamed:@"first"]; } return self; } SecondViewController.m中的构造方法: - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = NSLocalizedString(@"Second", @"Second"); self.tabBarItem.image = [UIImage imageNamed:@"second"]; } return self; } 在这个两个构造方法中设置标题属性的时候使用了NSLocalizedString宏,NSLocalizedString宏本质上是调用NSBundle的localizedStringForKey:value:table:方法,NSLocalizedString是从默认字符串资源文件(Localizable.strings)中取出本地化的字符串。 字符串资源文件默认命名为Localizable.strings,文件采用UTF-16编码。如果静态文本不是很多可以自己创建Localizable.strings文件。选择“Supporting Files”组,打开菜单File→New→File…,选择iOS→Resource→String File,输入文件名“Localizable.strings”。 选择文件Localizable.strings打开文件显示检查器,点击Localization中的“Make localized”按钮,这可以帮助我们创建本地化的Localizable.strings文件。 点击“Make localized”按钮弹出一个选择本地化语言的对话框。我们可以选择English,然后点击Localize按钮。 然后再按照事实上,添加简体中文本地化文件 英文版中Localizable.strings文件中添加内容: /* First */ "First" = "First"; /* Second */ "Second" = "Second"; 中文版中Localizable.strings文件中添加内容: /* First */ "First" = "第一"; /* Second */ "Second" = "第二"; 使用genstring工具 但是有的时候字符串很多,提取和编写起来很麻烦,此时我们可以借助于命令行工具genstring,从m或mm文件中扫描下面宏,并取出字符串输出到本地化文件中。 CFCopyLocalizedString CFCopyLocalizedStringFromTable CFCopyLocalizedStringFromTableInBundle CFCopyLocalizedStringWithDefaultValue NSLocalizedString NSLocalizedStringFromTable NSLocalizedStringFromTableInBundle NSLocalizedStringWithDefaultValue CF开头宏和NS开头宏两两对应,NS开头宏是Foundation 框架是基于Objective-C语言的,CF开头宏是Core Foundation 框架是基于c语言的。NSLocalizedStringFromTable和NSLocalizedStringFromTableInBundle函数是在自定义字符串资源文件名时使用。 下面是genstrings命名的基本语法: genstrings [-a] [-q] [-o <outputDir>] sourcefile 其中参数: -a 在存在的文件后面追加内容 -q 关闭多个键/值对的警告 -o 指定输出目录 因此如果我们想输出到en.lproj目录,则代码如下: genstrings -o en.lproj *.m 这样就在en.lproj目录下面产生了Localizable.strings文件,需要注意的是上面的命令每次运行的时候都会覆盖Localizable.strings文件,如果内容不想覆盖可以使用-a参数,然后在文件中进行修改。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1226421,如需转载请自行联系原作者

优秀的个人博客,低调大师

Objective-C编码规范:26个方面解决iOS开发问题(转)

1 <br><a href= "http://www.csdn.net/article/2015-06-01/2824818-objective-c-style-guide/1" target= "_blank" ><span style= "font-family: verdana, Arial, Helvetica, sans-serif;" ><span style= "font-size: 14px; line-height: 21px; white-space: normal;" ><strong>链接</strong></span></span></a><br><br><br> 本文转自SharkBin博客园博客,原文链接:http://www.cnblogs.com/SharkBin/p/4991670.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android联机或者模拟器单独测试Activity的辅助Activity示例开发

想起写个单独测试Activity的辅助Activity的原因是在联机测试的时候IDEA或者Android Studio中的指定运行Activity功能没法使用了。 下面付IDE中指定运行Activity的界面截图: 辅助Activity要做的事情是将辅助Activity作为启动的默认Activity,其主界面中以ListView的形式展示所有Activity,通过单击ListView的Item项来启动要测试的Activity。 1. 辅助Activity代码示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 package secondriver.app; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** *CreatedbyBronchoon2015/11/15. */ public class TestActivitiesActivity extends Activity implements AdapterView.OnItemClickListener{ private LinearLayoutmRootView; private ListViewmListView; private ArrayAdaptermAdapter; private List<Class>mAllActivities; @Override protected void onCreate(BundlesavedInstanceState){ super .onCreate(savedInstanceState); initView(); mAllActivities=getActivities( this , this .getPackageName(),Arrays.<Class>asList( this .getClass())); mAdapter= new ArrayAdapter( this ,android.R.layout.simple_list_item_1,android.R.id.text1,mAllActivities); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener( this ); } private void initView(){ mRootView= new LinearLayout( this ); mListView= new ListView( this ); mListView.setId(android.R.id.list); mRootView.addView(mListView,ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); setContentView(mRootView); } @Override public void onItemClick(AdapterView<?>parent,Viewview, int position, long id){ Classactivity=mAllActivities.get(position); //启动指定的Activity startActivity( new Intent( this ,activity)); } /** *获取所有要测试的ActivityClass * *@paramcontext *@parampackageName *@paramexcludeActivities *@return */ public static List<Class>getActivities(Contextcontext,StringpackageName,List<Class>excludeActivities){ final StringTAG= "GET_ACTIVITY" ; List<Class>includeActivities= new ArrayList<>(); try { PackageInfopackageInfo=context.getPackageManager().getPackageInfo(packageName,PackageManager.GET_ACTIVITIES); if (packageInfo.activities!= null ){ ActivityInfo[]activityInfos=packageInfo.activities; Log.d(TAG, "Find" +activityInfos.length+ "activityinAndroidManifest.xml." ); for (ActivityInfoactivityInfo:activityInfos){ ClassactivityClass; StringactivityName=activityInfo.name; try { activityClass=Class.forName(activityName); if (Activity. class .isAssignableFrom(activityClass)){ includeActivities.add(activityClass); } } catch (ClassNotFoundExceptione){ Log.d(TAG, "Classnotfoundactivity" +activityName+ "inpackage" +packageName); } } } Log.d(TAG, "Found" +includeActivities.size()+ "activitylistis:" +Arrays.toString(includeActivities.toArray())); if ( null !=excludeActivities){ includeActivities.removeAll(excludeActivities); } Log.d(TAG, "Last" +includeActivities.size()+ "activitylistis:" +Arrays.toString(includeActivities.toArray())); } catch (PackageManager.NameNotFoundExceptione){ Log.d(TAG, "Androidsystemnotfoundpackage" +packageName); } return includeActivities; } } 在AndroidManifest.xml中讲辅助Activity设置为默认启动的Activity,之后就可以通过选择点击要启动的Activity来进行测试。该示例还可以通过添加一些代码来增强,比如启动Activity的时候可以通过输入对话框的方式携带数据至启动的Activity。测试完成后删除或者充足默认启动的Activity即可。 2. 配置AndroidManifest.xml : 1 2 3 4 5 6 7 8 < activity android:name = ".TestActivitiesActivity" > < intent-filter > < action android:name = "android.intent.action.MAIN" /> < category android:name = "android.intent.category.LAUNCHER" /> </ intent-filter > </ activity > < activity android:name = ".OneActivity" /> < activity android:name = ".TwoActivity" /> 3. 调试日志: 1 2 3 11 - 15 20 : 07 : 31.899 10665 - 10665 /secondriver.appD/GET_ACTIVITY:Find 3 activityinAndroidManifest.xml. 11 - 15 20 : 07 : 31.899 10665 - 10665 /secondriver.appD/GET_ACTIVITY:Foundactivityhave 3 listis:[ class secondriver.app.TestActivitiesActivity, class secondriver.app.OneActivity, class secondriver.app.TwoActivity] 11 - 15 20 : 07 : 31.899 10665 - 10665 /secondriver.appD/GET_ACTIVITY:Lastactivityhave 2 listis:[ class secondriver.app.OneActivity, class secondriver.app.TwoActivity] 从日志中可以看到一共发现了3个Activity类,去除辅助的Activity,在ListView中讲显示2个Item项。 后期追加内容: 4. 结果效果图 新源码参见附件:TestActivitiesActivity.java.txt Item状态变化Drawable文件内容如下: 本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1712943,如需转载请自行联系原作者

优秀的个人博客,低调大师

【移动开发】Android中异步加载数据(二)AsyncTask异步更新界面

今天介绍第二种异步更新界面的方式:AsyncTask 官方文档: AsyncTask enables proper and easyuse of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers. AsyncTask能够更恰当和更简单的去使用UI线程。这个类允许执行后台操作和展现结果在UI线程上,无需操纵线程和/或处理程序。AsyncTask的内部实现是一个线程池,每个后台任务会提交到线程池中的线程执行,然后使用Thread+Handler的方式调用回调函数。 1.AsyncTask抽象出后台线程运行的五个状态: 分别是:1、准备运行,2、正在后台运行,3、进度更新,4、完成后台任务,5、取消任务,对于这五个阶段,AsyncTask提供了五个回调函数: 1、准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用。这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。 2、正在后台运行:doInParams...),该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位(unitsof progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。 3. 进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)方法调用完后被调用。一般用于动态地显示一个进度条。 4. 完成后台任务:onPostExecute(Result),当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。 5、取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用 2.使用: AsyncTask必须使用子类。子类会覆盖至少一个方法(doInParams…)),通常将覆盖第二个(onPostExecute(结果)。< /span> AsyncTask的构造函数有三个模板参数:AsyncTask<Params, Progress, Result> 1.Params,传递给后台任务的参数类型。 2.Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。) 3.Result, 后台执行返回的结果的类型。 AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.Toast; /** * AsyncTask 实现异步加载图片 * @author ZHF * */ public class MainActivity extends Activity { public static final String IMG_URL= "http://images.51cto.com/images/index/Images/Logo.gif" ; Button btn_asynctask; ImageView imgView; ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); //加载控件 imgView = (ImageView) this .findViewById(R.id.imageView); btn_asynctask = (Button) this .findViewById(R.id.btn_AsyncTask); progressBar = (ProgressBar) this .findViewById(R.id.progressBar); //绑定监听器 btn_asynctask.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { GetImgTask getImgTask = new GetImgTask(); getImgTask.execute(IMG_URL); //执行该任务 } }); } /**获取网络图片任务**/ private class GetImgTask extends AsyncTask<String, Integer, Bitmap> { /**在 doInParams...)之前被调用,在ui线程执行 **/ @Override protected void onPreExecute() { imgView.setImageBitmap( null ); progressBar.setProgress( 0 ); //进度条复位 } /**在后台线程中执行的任务**/ @Override protected Bitmap doInString... params) { publishProgress( 0 ); //会调用onProgressUpdate更新界面 InputStream inputStream = null ; Bitmap imgBitmap = null ; try { URL url = new URL(IMG_URL); if (url != null ) { HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout( 2000 ); connection.setDoInput( true ); connection.setRequestMethod( "GET" ); int code = connection.getResponseCode(); if ( 200 == code) { inputStream = connection.getInputStream(); imgBitmap = BitmapFactory.decodeStream(inputStream); } } } catch (Exception e) { e.printStackTrace(); return null ; } publishProgress( 100 ); //下载完成,更新进度条为满格 //这里不是UI线程,故不能直接setImage(imgBitmap), return imgBitmap; } /**在调用publishProgress之后被调用,在ui线程执行 **/ @Override protected void onProgressUpdate(Integer... values) { progressBar.setProgress(values[ 0 ]); //设置进度条的进度 } /**在后台线程执行完成之后,调用该方法,获取数据更新界面**/ @Override protected void onPostExecute(Bitmap result) { if (result != null ) { Toast.makeText(MainActivity. this , "成功获取图片" , Toast.LENGTH_LONG).show(); imgView.setImageBitmap(result); } else { Toast.makeText(MainActivity. this , "获取图片失败" , Toast.LENGTH_LONG).show(); } } /**取消任务,在ui线程执行 **/ @Override protected void onCancelled() { progressBar.setProgress( 0 ); //进度条复位 super .onCancelled(); } } } 分析: 1.点击按钮之后,创建一个任务,参数值为url(所以第一个参数为String) 2.UI线程执行onPreExecute(),把ImageView的图片清空,progrssbar的进度清零。 3.后台线程执行doInBackground(),不可以在doInBackground()操作ui,调用publishProgress(0)更新进度,此时会调用onProgressUpdate(Integer...progress)更新进度条(进度用整形表示,因此AsyncTask的第二个模板参数是Integer)。函数最后返回result(例子中是返回Bitmap类型,因此AsyncTask的第三个模板参数是Bitmap)。 4.当后台任务执行完成后,调用onPostExecute(Result),传入的参数是doInBackground()中返回的对象。 参考博客:http://blog.csdn.net/mylzc/article/details/6772129 源码下载请看附件 附件:http://down.51cto.com/data/2363166 本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1252156,如需转载请自行联系原作者

优秀的个人博客,低调大师

【移动开发】Android中一些你可能不太知道的东西

今天,我们来浅谈一下你可能不知道的一些东东 1.不用在意剩余内存的大小 其实很多人都是把使用其他系统的习惯带过来来了。android大多应用没有退出的设计其实是有道理的(下一篇我会讲到Android应用程序完全退出方法),这和系统对进程的调度机制有关系。如果你知道java,就能更清楚这机制了。其实和java的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度 有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊。但事实上他并不影响速度。相反加快了下次启动应用的速度。 这本来是android标榜的优势之一,如果人为去关闭进程,没有太大必要。特别是使用自动关进程的软件。(这里解决了大家非要关进程的误区!) 2.为什么内存少的时候运行大型程序会慢呢? 那其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。所以,通过更改内存阀值的程序可以有一定改善。但改动也可能带来一些问题,取决于值的设定。 那么,进程管理软件有无必要呢?有的。就是在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度。但一些小程序,完全可交由系统自己管理。 3.不关程序是不是会更耗电? 这里讲解一下android后台的原理,你就明白了。android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。所以为什么有的程序切出去重进会到主界面。但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务。服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到,标签是service。 所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个android的优点呢? 4.为什么android一个应用看起来那么耗内存 大家知道,android上的应用是java,当然需要虚拟机,而android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机。这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。(跟塞班也不一样,安卓不容易死机重启) 以上这些设计确保了android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现。 大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,很没必要。大家不妨按我说的习惯来用用这个系统。 本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1248169 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android UI开发第十五篇——分享一个登录缓冲界面

今天在网上发现了一个很漂亮的缓冲界面,在这里分享一下。主要还是用的android Anim。 publicclassMainextendsActivity{ privateAnimationanm; privateintmarginsTop; publicList<ImageView>images; publicLinearLayoutll; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); DisplayMetricsdm=this.getResources().getDisplayMetrics(); intheight=dm.heightPixels; marginsTop=height-100; anm=AnimationUtils.loadAnimation(this,R.anim.myanim); ll=newLinearLayout(this); ll.setBackgroundResource(R.drawable.background); images=newArrayList<ImageView>(); initImage(ll); playAnimation(); setContentView(ll); } privatevoidplayAnimation(){ newThread(){ @Override publicvoidrun() { try{ Thread.sleep(1000); }catch(InterruptedExceptione){ e.printStackTrace(); } intruncount=0; while(true) { if(runcount<2) { for(inti=0;i<=6;i++) { handler.sendEmptyMessage(i); try{ Thread.sleep(400); }catch(InterruptedExceptione){ e.printStackTrace(); } } runcount++; }else { handler.sendEmptyMessage(99); runcount=0; } } } }.start(); } Handlerhandler=newHandler(){ @Override publicvoidhandleMessage(Messagemsg){ switch(msg.what) { case0: images.get(0).setImageDrawable(Main.this.getResources().getDrawable(R.drawable.l)); images.get(0).startAnimation(anm); break; case1: images.get(1).setImageDrawable(Main.this.getResources().getDrawable(R.drawable.o)); images.get(1).startAnimation(anm); break; case2: images.get(2).setImageDrawable(Main.this.getResources().getDrawable(R.drawable.a)); images.get(2).startAnimation(anm); break; case3: images.get(3).setImageDrawable(Main.this.getResources().getDrawable(R.drawable.d)); images.get(3).startAnimation(anm); break; case4: images.get(4).setImageDrawable(Main.this.getResources().getDrawable(R.drawable.i)); images.get(4).startAnimation(anm); break; case5: images.get(5).setImageDrawable(Main.this.getResources().getDrawable(R.drawable.n)); images.get(5).setAnimation(anm); break; case6: images.get(6).setImageDrawable(Main.this.getResources().getDrawable(R.drawable.g)); images.get(6).setAnimation(anm); break; case99: clearImage(); break; } } }; privatevoidclearImage() { for(ImageViewimage:images) { image.setImageDrawable(null); image.destroyDrawingCache(); } } privatevoidinitImage(LinearLayoutlayout){ layout.setGravity(Gravity.CENTER_HORIZONTAL); LinearLayout.LayoutParamsparam=newLinearLayout.LayoutParams(40,40); param.setMargins(30,marginsTop,0,0); LinearLayout.LayoutParamsparam2=newLinearLayout.LayoutParams(40,40); param2.setMargins(-5,marginsTop,0,0); ImageViewl=newImageView(this); l.setLayoutParams(param); layout.addView(l); images.add(l); ImageViewo=newImageView(this); o.setLayoutParams(param2); layout.addView(o); images.add(o); ImageViewa=newImageView(this); a.setLayoutParams(param2); layout.addView(a); images.add(a); ImageViewd=newImageView(this); d.setLayoutParams(param2); layout.addView(d); images.add(d); ImageViewi=newImageView(this); i.setLayoutParams(param2); layout.addView(i); images.add(i); ImageViewn=newImageView(this); n.setLayoutParams(param2); layout.addView(n); images.add(n); ImageViewg=newImageView(this); g.setLayoutParams(param2); layout.addView(g); images.add(g); } } <?xmlversion="1.0"encoding="utf-8"?> <setxmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <scaleandroid:interpolator="@android:anim/accelerate_interpolator" android:fromXScale="0.5" android:toXScale="1.2" android:fromYScale="0.5" android:toYScale="1.2" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:startOffset="-50" android:duration="100" /> </set> 代码地址:http://www.devdiv.com/thread-101608-1-1.html 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/817279,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册