首页 文章 精选 留言 我的

精选列表

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

【Android游戏开发十二】详解SharedPreference 与 FIleInputStream/FileOutputStream将数...

对于游戏中的数据进行保存方式,在Android中常用的有四种保存方式,这里我先给大家统一先简单的介绍下: 1. SharedPreference 此保存方式试用于简单数据的保存,文如其名属于配置性质的保存,不适合数据比较大的保存方式; 2. 文件存储 (FIleInputStream/FileOutputStream) 此保存方式比较适合游戏的保存和使用,可以保存较大的数据,因为相对于SQLite来说更容易让童鞋们接受,此方式不仅能把数据存储在系统中也能将数据保存到SDcard中; 3.SQLite 此保存方式比较适合游戏的保存和使用,可以保存较大的数据,并且可以将自己的数据存储到文件系统或者数据库当中,也可以将自己的数据存储到SQLite数据库当中,也能将数据保存到SDcard中; 4.ContentProvider (不推荐用于游戏保存) 此保存方式不推荐用于游戏保存,因为此方式不仅能存储较大数据,还支持多个程序之间就的数据进行交换!!! 但是由于游戏中基本就不可能去访问外部应用的数据,所以对于此方式我不予讲解, 有兴趣的可以去自行百度 google 学习; 以上简单的对几种常用的保存方式进行的概述,那么,下面会详细的去分析每个的优缺点以及每种保存的实现和需要注意的地方! 下面我首先向大家介绍第一种保存方式: 保存方式之:《SharedPreference》 优点: 简单、方便、适合简单数据的快速保存 缺点:1.存数的文件只能在同一包内使用,不能在不同包之间使用! 2.默认将数据存放在系统路径下 /data/data/com.himi/ ,没有找到放SD卡上的方法。 总结:其实本保存方式如同它的名字一样是个配置保存,虽然方便,但只适合存储比较简单的数据! main.xml : <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextViewandroid:layout_width="fill_parent" android:layout_height="wrap_content"android:text="保存数据练习!" android:textSize="20sp"android:textColor="#ff0000"android:id="@+id/tv_title"/> <TextViewandroid:layout_width="fill_parent" android:layout_height="wrap_content"android:text="请输入帐号"/> <EditTextandroid:layout_width="fill_parent" android:layout_height="wrap_content"android:id="@+id/editText_Login" android:text=""></EditText> <TextViewandroid:layout_width="fill_parent" android:layout_height="wrap_content"android:text="请输入密码"/> <EditTextandroid:layout_width="fill_parent" android:layout_height="wrap_content"android:id="@+id/editText_Password" android:text=""></EditText> <Buttonandroid:id="@+id/button_save"android:layout_width="wrap_content" android:layout_height="wrap_content"android:text="保存"></Button> <Buttonandroid:id="@+id/button_load"android:layout_width="wrap_content" android:layout_height="wrap_content"android:text="取出数据" android:visibility="invisible"></Button> </LinearLayout> 先把xml文件放上来的原因是因为我在此篇中介绍的 SharedPreference 和 文件存储 (FIleInputStream/FileOutputStream),都共用此xml,很简单,两个textview 两个 editview 以及两个button,这里就不多说了; 下面是SharedPreference 的代码实现和详细讲解: /** *@authorHimi *@保存方式:SharedPreference *@注意:SharedPreference可以跨程序包使用,多谢二楼童鞋提醒! *@操作模式:Context.MODE_PRIVATE:新内容覆盖原内容 *Context.MODE_APPEND:新内容追加到原内容后 *Context.MODE_WORLD_READABLE:允许其他应用程序读取 *Context.MODE_WORLD_WRITEABLE:允许其他应用程序写入,会覆盖原数据。 */ publicclassMainActivityextendsActivityimplementsOnClickListener{ privateEditTextet_login,et_password; privateButtonbtn_save; privateTextViewtv_title; privateSharedPreferencessp; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); btn_save=(Button)findViewById(R.id.button_save); btn_save.setOnClickListener(this); et_login=(EditText)findViewById(R.id.editText_Login); et_password=(EditText)findViewById(R.id.editText_Password); tv_title=(TextView)findViewById(R.id.tv_title); //这里我们先调用getSharedPreferences()来实例化一个SharedPreferences, //第二个参数是指:操作模式(上面对各种操作模式已有解释) sp=getSharedPreferences("Setting_himi",MODE_PRIVATE); /* *下面代码是我们要在程序刚启动的时候我们来读取之前的数据, *当然我们还没有保存任何数据所以肯定找不到!! *如果找不到也没关系会默认返回一个参数值,看下面的方法含义便知! */ sp.getString("login",""); //getString()类似哈希表,一个key一个volue, //这个方法如果找不到对应的第一个参数(key),那么将以第二个参数作为此key的返回值 et_login.setText(sp.getString("login","")); et_password.setText(sp.getString("password","")); } @Override publicvoidonClick(Viewv){ if(v==btn_save){ if(et_login.getText().toString().equals("")) tv_title.setText("请输入帐号!"); elseif(et_password.getText().toString().equals("")) tv_title.setText("请输入密码!"); else{ sp.edit() .putString("login",et_login.getText().toString()) .putString("password",et_password.getText().toString()) .commit(); //从sp.edit()开始进入编辑状态,直到commit()提交! tv_title.setText("保存成功!可重新打开此程序,测试是否已经保存数据!"+ "/n(或者在'FileExplorer'窗口下-data-data-com.himi路径下"+ "是否存在"+"了'Setting_himi.xml')"); } } } } 代码中的注释的很清楚了,比较简单,不多说了。 保存方式之: 《文件存储 OutputStream/InputStream》 优点: 1.适合游戏存储,能存储较大数据; 2.不仅能存储到系统中,也能存储到SD卡中! 总结:如果童鞋们对SQL不太熟习的话那么选择此种方式最为合适的啦、嘿嘿 /** *@authorHimi *@保存方式:Stream数据流方式 *@注意1:默认情况下,使用openFileOutput方法创建的文件只能被其调用的应用使用, *其他应用无法读取这个文件,如果需要在不同的应用中共享数据; * *@注意2:因为androidos内部闪存有限,所以适合保存较少的数据,当然我们也有解决的方法, *就是把数据保存在SD开中,这样就可以了,后面我也会向大家讲解! * *@提醒1调用FileOutputStream时指定的文件不存在,Android会自动创建它。 *另外,在默认情况下,写入的时候会覆盖原文件内容,如果想把新写入的内 *容附加到原文件内容后,则可以指定其mode为Context.MODE_APPEND。 * *@提醒2启动程序就初始化的时候一定要注意处理!代码中有注释!一定要仔细看! * *@提醒3这里我给大家讲两种方式,一种是原生态file流来写入/读入, *另外一种是用Data流包装file流进行写入/读入其实用data流来包装进行操作; *原因是:包装后支持了更多的写入/读入操作,比如:file流写入不支持 *writeUTF(Stringstr);但是用Data包装后就会支持。 * *@操作模式:Context.MODE_PRIVATE:新内容覆盖原内容 *Context.MODE_APPEND:新内容追加到原内容后 *Context.MODE_WORLD_READABLE:允许其他应用程序读取 *Context.MODE_WORLD_WRITEABLE:允许其他应用程序写入,会覆盖原数据。 */ publicclassMainActivityextendsActivityimplementsOnClickListener{ privateEditTextet_login,et_password; privateButtonbtn_save; privateTextViewtv_title; privateFileOutputStreamfos; privateFileInputStreamfis; privateDataOutputStreamdos; privateDataInputStreamdis; @Override publicvoidonCreate(BundlesavedInstanceState){ Stringtemp=null; super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); btn_save=(Button)findViewById(R.id.button_save); btn_save.setOnClickListener(this); et_login=(EditText)findViewById(R.id.editText_Login); et_password=(EditText)findViewById(R.id.editText_Password); tv_title=(TextView)findViewById(R.id.tv_title); try{ //openFileInput不像sharedPreference中 //getSharedPreferences的方法那样找不到会返回默认值, //这里找不到数据文件就会报异常,所以finally里关闭流尤为重要!!! if(this.openFileInput("save.himi")!=null){ //--------------单纯用file来读入的方式----------------- //fis=this.openFileInput("save.himi"); //ByteArrayOutputStreambyteArray=new //ByteArrayOutputStream(); //byte[]buffer=newbyte[1024]; //intlen=0; //while((len=fis.read(buffer))>0){ //byteArray.write(buffer,0,len); //} //temp=byteArray.toString(); //--------------用data流包装后的读入的方式------------ fis=this.openFileInput("save.himi");//备注1 dis=newDataInputStream(fis); et_login.setText(dis.readUTF()); et_password.setText(dis.readUTF()); //这里也是在刚启动程序的时候去读入存储的数据 //读的时候要注意顺序;例如我们写入数据的时候 //先写的字符串类型,我们也要先读取字符串类型,一一对应! } }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ //在finally中关闭流!因为如果找不到数据就会异常我们也能对其进行关闭操作; try{ if(this.openFileInput("save.himi")!=null){ //这里也要判断,因为找不到的情况下,两种流也不会实例化。 //既然没有实例化,还去调用close关闭它,肯定"空指针"异常!!! fis.close(); } }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } @Override publicvoidonClick(Viewv){ if(Environment.getExternalStorageState()!=null){ //这个方法在试探终端是否有sdcard! Log.v("Himi","有SD卡"); } if(v==btn_save){ if(et_login.getText().toString().equals("")) tv_title.setText("请输入帐号!"); elseif(et_password.getText().toString().equals("")) tv_title.setText("请输入密码!"); else{ try{ //------单纯用file来写入的方式-------------- //fos=newFileOutputStream(f); //fos.write(et_login.getText().toString().getBytes()); //fos.write(et_password.getText().toString().getBytes()); //------data包装后来写入的方式-------------- fos=this.openFileOutput("save.himi",MODE_PRIVATE);//备注2 dos=newDataOutputStream(fos); dos.writeUTF(et_login.getText().toString()); dos.writeUTF(et_password.getText().toString()); tv_title.setText("保存成功!可重新打开此程序,测试是"+ "否已经保存数据!/n(或者在'FileExplorer'"+ "窗口下-data-data-com.himi-files路径下"+ "是否存在了'save.himi')"); }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ //在finally中关闭流这样即使try中有异常我们也能对其进行关闭操作; try{ dos.close(); fos.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } } } } 以上代码中实现了两种流形式来完成写入和读入,这里我们为什么要使用Data流来包装,其实不光是获得更多的操作方式,最主要的是方便快捷,你比如用file来读入的时候,明显的复杂了一些不说,它还一次性把所有数据都取出来了,不便于对数据的处理! 强调的有几点: 1: 在一开始对数据的访问再次提醒童鞋们,这个跟sharedPreference的获取方式不一样,sharedPreference 的获取方式可以得到一个默认的值,但是你用咱们获取的是个文件 而且直接就去open这个文件,一旦不存在必定异常,所以这一块的异常处理,以及finally的处理一定要处理得当。 2.其实在一开始用data包装的时候发现写入的字符串在读入的时候发现字符乱码了,查了api才发现,api规定当写入字符串的时候必须写入UTF-8格式的编码,但是后来不知道怎么了就没事了。 - -、所以这里如果童鞋们遇到此问题,我给出大家一个解决方法,就是在写入的时候我们不要去DataOutputStream 来包装而是用,OutputStreamWriter ,因为在构造的可以设定编码! OutputStreamWriter osw = new OutputStreamWriter(fis,"UTF-8"); String content = EncodingUtils.getString(buffer,"UTF-8"); 这个也能把字符数组转码制! 这样写入的就肯定是UTF-8编码的字符啦、 下面介绍如何把我们的数据通过 OutputStream/InputStream 存入SD卡中! 其实将我们的数据放入SD卡中,无疑就需要对代码进行两处的修改: 注意:一定要有SD卡!对于如何创建SD卡在前一篇文章中已经说了两种方式,不会的童鞋可以去看下; 第一:检查是否装有SD卡; 第二: 修改读入的地方(备注1) fis = this.openFileInput("save.himi"); //这里没有路径,路径是默认的 data-data-com.himi-files下 替换成我们的SD卡的路径就可以了: File path = new File("/sdcard/himi/save.himi");//这里新建一个File目录路径 fis = new FileInputStream(path);传入路径 第三:修改写入的地方(备注2) fos = this.openFileOutput("save.himi", MODE_PRIVATE);这里也是默认路径,需要对其修改, 注意:这里修改了,那么在finally中的判定大家也要对应的适当修改; 注意:如果是系统路径,当没有此文件的时候,android 会默认创建一个!但是我们放入SD卡的时候要自己创建目录路径和文件! if(Environment.getExternalStorageState()!=null){//这个方法在试探终端是否有sdcard! Log.v("Himi","有SD卡"); Filepath=newFile("/sdcard/himi");//创建目录 Filef=newFile("/sdcard/himi/save.himi");//创建文件 if(!path.exists()){//目录不存在返回false path.mkdirs();//创建一个目录 } if(!f.exists()){//文件不存在返回false f.createNewFile();//创建一个文件 } fos=newFileOutputStream(f);//将数据存入sd卡中 } 第四: 因为我们要在SD卡中进行写入的操作,所以要在配置文件中声明权限! AndroidMainfest.xml <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.himi" android:versionCode="1" android:versionName="1.0"> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-sdkandroid:minSdkVersion="4"/> </manifest> 这一句就是啦~ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 为了让大家看到所放的位置,所以把整个xml放出来供参考; 那么当创建路径和文件的时候,我们对其检查SD卡中是否已经存在exists()方法 ,如果已经存在就不去创建,这样避免下次再次写入数据的时候又新建了文件和路径、 其实我们在可以在启动程序的时候判断如果没有此文件,我们可以直接紧接着创建一个文件,这些都属于优化上的了,我主要是让大家引入,学会,那么其他的简化啦,优化啦,其他方式去实现啦都留给各位同学自己了、 OK、今天就先介绍到这里,后面会单独剖析SQLite如何存入数据,以及对数据操作的! 希望大家继续关注! (推荐大家订阅本博客,因为咱的更新速度可是很快的~娃哈哈) 本篇源码:原文链接:http://www.himigame.com/android-game/327.html 新的一年了小明祝福大家新的一年里,事业顺利,身体健康,全家幸福美满! 上张本项目的截图: 本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/606397,如需转载请自行联系原作者

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

手机开发-京东360buy手机版的图片加载

JingDong:When it render the “search result” page ,(every item has the picture) ,it will buffer all the pictures in the SD card to accelerate the display. Tested from Kevin’s emulator, we can see ,that all the images that requested are downloaded intomnt/sdcard/imagefolder. We open it with image tool ,and see that the images are exactly the same that we see from the android client. So next time ,if we want to see the previous item ,we do not need to launch the REST call again ( because it is very slow for 1G /2G network) ,instead ,it only retrieved from the SDCard locally ,which leads to a faster speed. Result analysis: Advantage: obviously reduce the times to send REST request to server and reduce the network traffic. Disadvantage: we need to clear the temp contents (buffered images ,etc) regularly. 本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/835920,如需转载请自行联系原作者

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

Android GIS开发系列-- 入门季(15) 网络图层加载

一、首先我们来看一个网络图层: http://services.arcgisonline.com/arcgis/rest/services/World_Street_Map/MapServer,这是全球街道图。加载的代码也很简单: private static final String WORLD_STREETS_URL = "http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"; private MapView mMapView = null; private ArcGISTiledMapServiceLayer mWorldStreetsLayer = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMapView = (MapView) findViewById(R.id.map_view); mWorldStreetsLayer = new ArcGISTiledMapServiceLayer(WORLD_STREETS_URL); mMapView.addLayer(mWorldStreetsLayer); mWorldStreetsLayer.setOnStatusChangedListener(new OnStatusChangedListener() { @Override public void onStatusChanged(Object o, STATUS status) { if (status==STATUS.INITIALIZED){ Log.i("huang","加载成功"); }else if(status==STATUS.INITIALIZATION_FAILED||status==STATUS.LAYER_LOADING_FAILED){ Log.i("huang","加载失败"); } } }); } 效果图 问:为什么用ArcGISTiledMapServiceLayer 加载而不用其他图层加载呢? 用浏览器打开http://services.arcgisonline.com/arcgis/rest/services/World_Street_Map/MapServer,可以看到详细信息。 它的子图层只有一个: 下面是坐标信息,注意Single Fused Map Cache: true,支持缓存。 与Tile Info信息, 通过信息说明这是一个TiledLayer,而ArcGISTiledMapServiceLayer是TiledLayer子类的子类,看一下ArcGISTiledMapServiceLayer的介绍。 点开World Street Map链接,http://services.arcgisonline.com/arcgis/rest/services/World_Street_Map/MapServer/0,这是它的唯一子图层。真正加载的也是这个图层 Type虽然说是FeatureLayer,但它得用ArcGISFeatureLayer加载。 ArcGISFeatureLayer arcGISFeatureLayer = new ArcGISFeatureLayer(WORLD_STREETS_URL+"/0", ArcGISFeatureLayer.MODE.ONDEMAND); SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(Color.argb(0,0,0,0),SimpleFillSymbol.STYLE.SOLID); mMapView.addLayer(arcGISFeatureLayer); arcGISFeatureLayer.setRenderer(new SimpleRenderer(simpleFillSymbol)); arcGISFeatureLayer.setOnStatusChangedListener(new OnStatusChangedListener() { @Override public void onStatusChanged(Object o, STATUS status) { if (status==STATUS.INITIALIZED){ Log.i("huang","加载成功"); }else if(status==STATUS.INITIALIZATION_FAILED||status==STATUS.LAYER_LOADING_FAILED){ Log.i("huang","加载失败"); } } }); 上面虽然加载成功,但并看不到图层,而且报错: FeatureSetCallback.onError com.esri.core.io.EsriServiceException: Requested operation is not supported by this service. The requested capability is not supported. 仔细再看网络信息, 大体上知道为什么报 The requested capability is not supported。也就是不能用这种方法加载,而得用前面的代码加载!!! ArcGISDynamicMapServiceLayer 服务地址:http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer,这是美国的高铁图。 用浏览器打开,有三个子图层,Single Fused Map Cache: false! 下面是ArcGISDynamicMapServiceLayer的介绍: 加载代码 : private static final String DYNAMIC_USA_HIGHWAY_URL = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer"; private ArcGISDynamicMapServiceLayer usaHighwayLayer = null; private MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMapView = (MapView) findViewById(R.id.map_view); usaHighwayLayer = new ArcGISDynamicMapServiceLayer(DYNAMIC_USA_HIGHWAY_URL); mMapView.addLayer(usaHighwayLayer); usaHighwayLayer.setOnStatusChangedListener(new OnStatusChangedListener() { @Override public void onStatusChanged(Object o, STATUS status) { if (status==STATUS.INITIALIZED){ Log.i("huang","加载成功"); }else if(status==STATUS.INITIALIZATION_FAILED||status==STATUS.LAYER_LOADING_FAILED){ Log.i("huang","加载失败"); } } });} 效果图 二、ArcGISFeatureLayer加载图层 服务地图http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/0,也就是上面服务的子图层。 ArcGISFeatureLayer arcGISFeatureLayer = new ArcGISFeatureLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/0", ArcGISFeatureLayer.MODE.ONDEMAND); mMapView.addLayer(arcGISFeatureLayer); arcGISFeatureLayer.setRenderer(new SimpleRenderer(new SimpleLineSymbol(Color.argb(250, 52, 17, 255),2))); arcGISFeatureLayer.setOnStatusChangedListener(new OnStatusChangedListener() { @Override public void onStatusChanged(Object o, STATUS status) { if (status==STATUS.INITIALIZED){ Log.i("huang","加载成功"); }else if(status==STATUS.INITIALIZATION_FAILED||status==STATUS.LAYER_LOADING_FAILED){ Log.i("huang","加载失败"); } } }); 注意要设置setRenderer,效果 ArcGISFeatureLayer 具有FeatureLayer的一些查询方法,与前面几讲里FeatureLayer查询相似,这里不再讲了。 //查询要素方法 queryIds(Query query, CallbackListener<int[]> callback) queryFeatures(Query query, CallbackListener<FeatureSet> callback) 在http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/0,页面底部, 点击Query进入查询要素界面,可直接 查询要素 where 1=1,点击Query(GET),可得到以下结果集 没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。 本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/7752063.html ,如需转载请自行联系原作者

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

android开发之启动模拟器并安装游戏apk

本文不讲环境设置,也不讲程序代码,咱们想讲如何把一个游戏APK文件,在模拟器上跑起来! 首先到网上下几个ANDROID的游戏到本地保存, 然后启动模拟器! 启动模拟器用命令行 CMD-> CD d:\android\android-sdk-151\tools-> emulator -avd avdname-> 如果提示找不到 avdname这个设备就用如下命令 emulator -avd HVGA-> 如图1所示 这样等待一小会,android的模拟器就启动起来了! 另起一个命令行 CMD-> CD D:\GAME-> adb install AssassinsCreed.apk-> 如图2所示 这样这个 《刺客信条》 的游戏就安装到android的模拟器上了! 如图3所示 好了!激动人心的时刻到了! 让我们进入 《刺客信条》 android版吧! 可惜是横版的,我这个模拟器是竖版的,看着比较别扭! 模拟器外观的定制: 480x320, landscape: emulator -skin HVGA-L 320x480, portrait : emulator -skin HVGA-P (default) 320x240, landscape: emulator -skin QVGA-L 240x320, portrait : emulator -skin QVGA-P 我们在启动模拟器时候加上这些参数就能得到对应的模拟器外观了 比如 CMD-> CD d:\android\android-sdk-151\tools-> emulator -avd avdname -skin HVGA-L-> 外观如下 emulator -avd avdname -skin HVGA-P-> 这个就是默认的模拟器竖版的! emulator -avd avdname -skin QVGA-L-> emulator -avd avdname -skin QVGA-P-> 喜欢用哪个模拟器就启动哪个吧! 最后一点,就是APK文件也和JAR一样是一个压缩包 用RAR等解压软件可以直接打开看里边的文件! 本文转自 kome2000 51CTO博客,原文链接:http://blog.51cto.com/kome2000/578684

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

Android GIS开发系列-- 入门季(11) Callout气泡的显示

一、气泡的简单显示 首先我们要获取MapView中的气泡,通过MapView的getCallout()方法获取一个气泡。看一下Callout的简单介绍: 大体的意思是通过MapView获取Callout,可以设置它的内容View,大小,显示的方位等。 写一个简单的测试: public class MainActivity extends Activity { private MapView mapView; private static final String TILED_WORLD_STREETS_URL = "http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"; private Callout callout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.map_view); //添加一个基础的底图 mapView.addLayer(new ArcGISTiledMapServiceLayer(TILED_WORLD_STREETS_URL)); //地图点击事件 mapView.setOnSingleTapListener(new OnSingleTapListener() { @Override public void onSingleTap(float x, float y) { //屏幕坐标转地图坐标 Point point = mapView.toMapPoint(x,y); //设置显示位置 callout.show(point); } }); initCallout(); } private void initCallout() { //获取一个气泡 callout = mapView.getCallout(); //设置最大的长宽 callout.setMaxWidth(1200); callout.setMaxHeight(300); TextView tv = new TextView(this); tv.setText("这是一个气泡"); callout.setContent(tv); CalloutStyle calloutStyle = new CalloutStyle(); //设置尖尖角的位置,尖尖显示在气泡的左下角, calloutStyle.setAnchor(Callout.ANCHOR_POSITION_LOWER_LEFT_CORNER); callout.setStyle(calloutStyle); } } 显示的效果图如下: 二、通过xml方式设置Callout的Style 新建一个xml放在res/xml下,例如: <?xml version="1.0" encoding="utf-8"?> <resources> <calloutViewStyle anchor="5" backgroundAlpha="255" backgroundColor="#ffffff" cornerCurveDp="20" frameColor="#000000" maxHeightDp="300" maxWidthDp="500" /> </resources> 只需调用callout.setStyle方法来设置。 没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。 本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/7751976.html ,如需转载请自行联系原作者

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

Android UI开发第十八篇——ActivityGroup实现tab功能

android.app包中含有一个ActivityGroup类,该类是Activity的容器,可以包含多个嵌套进来的Activitys,这篇文章就是借助ActivityGroup可以嵌套Activity的功能来实现Tab功能。tab这种UI在很多的移动应用中可以看到,包括android、iphone、window phone7等移动终端上都有这样的应用,Tab这种UI方式具有小视图大容量的特点。 首先,从SDK中doc文档中都可以获知,ActivityGroup类的父类是Activity(见下图),也就是说二者具有相同的接口和生命周期,同Activity一样,也有onCreate()、onPause()等函数可供我们重载。 ActivityGroup中有两个public方法(下图):ActivityGroup中可以调用getLocalActivityManage()方法获取LocalActityManage来管理Activity。 ActivityGroup实现的tab功能的效果图如下。 先看一下java代码: publicclassMainViewextendsActivityGroup{ @SuppressWarnings("unused") privateLinearLayoutbodyView,headview; privateLinearLayoutone,two,three,four; privateintflag=0;//通过标记跳转不同的页面,显示不同的菜单项 /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.view_main); initMainView(); //显示标记页面 showView(flag); one.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub flag=0; showView(flag); } }); two.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub flag=1; showView(flag); } }); three.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub flag=2; showView(flag); } }); four.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub flag=3; showView(flag); } }); } /* *初始化主界面 */ publicvoidinitMainView(){ headview=(LinearLayout)findViewById(R.id.head); bodyView=(LinearLayout)findViewById(R.id.body); one=(LinearLayout)findViewById(R.id.one); two=(LinearLayout)findViewById(R.id.two); three=(LinearLayout)findViewById(R.id.three); four=(LinearLayout)findViewById(R.id.four); } //在主界面中显示其他界面 publicvoidshowView(intflag){ switch(flag){ case0: bodyView.removeAllViews(); Viewv=getLocalActivityManager().startActivity("one", newIntent(MainView.this,OneView.class)).getDecorView(); one.setBackgroundResource(R.drawable.frame_button_background); two.setBackgroundResource(R.drawable.frame_button_nopressbg); three.setBackgroundResource(R.drawable.frame_button_nopressbg); four.setBackgroundResource(R.drawable.frame_button_nopressbg); bodyView.addView(v); break; case1: bodyView.removeAllViews(); bodyView.addView(getLocalActivityManager().startActivity("two", newIntent(MainView.this,TwoView.class)) .getDecorView()); one.setBackgroundResource(R.drawable.frame_button_nopressbg); two.setBackgroundResource(R.drawable.frame_button_background); three.setBackgroundResource(R.drawable.frame_button_nopressbg); four.setBackgroundResource(R.drawable.frame_button_nopressbg); break; case2: bodyView.removeAllViews(); bodyView.addView(getLocalActivityManager().startActivity( "three",newIntent(MainView.this,ThreeView.class)) .getDecorView()); one.setBackgroundResource(R.drawable.frame_button_nopressbg); two.setBackgroundResource(R.drawable.frame_button_nopressbg); three.setBackgroundResource(R.drawable.frame_button_background); four.setBackgroundResource(R.drawable.frame_button_nopressbg); break; case3: bodyView.removeAllViews(); bodyView.addView(getLocalActivityManager().startActivity( "four",newIntent(MainView.this,FourView.class)) .getDecorView()); one.setBackgroundResource(R.drawable.frame_button_nopressbg); two.setBackgroundResource(R.drawable.frame_button_nopressbg); three.setBackgroundResource(R.drawable.frame_button_nopressbg); four.setBackgroundResource(R.drawable.frame_button_background); break; default: break; } } } 程序中重要的是如下的方法: bodyView.removeAllViews(); bodyView.addView(getLocalActivityManager().startActivity("two", newIntent(MainView.this,TwoView.class)) .getDecorView()); 使用view的removeAllViews()方法清除不需要的view,使用addView(View v)方法添加需要的view。 getLocalActivityManager().startActivity("two",new Intent(MainView.this, TwoView.class))得到一个window对象,window对象调用 getDecorView()获取view。关于window的方法可以参考android.app.Window。 通过tab的效果图可以看到这个效果使用了上、中、下三种布局,layout就可以这样做了。实现layout就可以实现tab功能了。 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/817245,如需转载请自行联系原作者

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

Android UI开发第十二篇——动画效果Animation(一)

Android框架本身就使用了大量的动画效果,比如Activity切换的动画效果,Dialog弹出和关闭时的渐变动画效果以及Toast显示信息时的淡入淡出效果等等。Android系统框架为我们提供了一些动画类及其工具类,所以在Andorid应用中使用动画效果非常简单。Android中可以在xml中定义Animation,也可以在java code中定义。 Android中动画的实现分两种方式,一种方式是补间动画 Tween Animation,就是说你定义一个开始和结束,中间的部分由android自身实现。另一种叫逐帧动画 Frame Animation,就是说一帧一帧的连起来播放就变成了动画。 一、Tween Animation xml中实现: alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 JavaCode中 AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸伸缩动画效果 TranslateAnimation 画面转换位置移动动画效果 RotateAnimation 画面转移旋转动画效果 使用XML文件定义Tween Animation时XML文件的根节点可以是<alpha>、<scale> <translate>、<rotate>或者是把它们都放入<set>节点中。如下: <?xml version="1.0" encoding="utf-8"?> < set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha/> <scale/> <translate/> <rotate/> < /set> Java Code实现如下: AlphaAnimation: AnimationSet animationSet =newAnimationSet(true);//创建一个AnimationSet对象 AlphaAnimation alphaAnimation =newAlphaAnimation(1, 0);//创建一个AlphaAnimation对象 alphaAnimation.setDuration(1000);//设置动画执行的时间(单位:毫秒) animationSet.addAnimation(alphaAnimation);//将AlphaAnimation对象添加到AnimationSet当中 view.startAnimation(animationSet);//使用view的startAnimation方法开始执行动画 RotateAnimation : AnimationSet animationSet = newAnimationSet( true); /** * 前两个参数定义旋转的起始和结束的度数,后两个参数定义圆心的位置 */ RotateAnimation rotateAnimation =newRotateAnimation(0, 360, Animation.RELATIVE_TO_PARENT, 1f, Animation.RELATIVE_TO_PARENT, 0f); rotateAnimation.setDuration(5000); animationSet.addAnimation(rotateAnimation); imageView.startAnimation(animationSet); TranslateAnimation: AnimationSet animationSet =newAnimationSet(true); /** * x和y轴的起始和结束位置 */ TranslateAnimation translateAnimation =newTranslateAnimation ( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 1.0f ); translateAnimation.setDuration(1000); animationSet.addAnimation(translateAnimation); view.startAnimation(animationSet); ScaleAnimation: AnimationSet animationSet =newAnimationSet(true); /** * 围绕一个点伸缩 */ ScaleAnimation scaleAnimation =newScaleAnimation(1, 0.1f, 1, 0.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animationSet.addAnimation(scaleAnimation); animationSet.setStartOffset(1000); animationSet.setFillAfter(true); animationSet.setFillBefore(false); animationSet.setDuration(2000); view.startAnimation(animationSet); 代码下载地址: http://www.devdiv.com/forum.php?mod=viewthread&tid=88504&pid=546599&page=1&extra=#pid546599 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/817314,如需转载请自行联系原作者

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册