首页 文章 精选 留言 我的

精选列表

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

Android开发学习笔记:浅谈Content Provider

一.Content Provider的概念介绍 Content Providers是所有应用程序之间数据存储和检索的桥梁,它使得各个应用程序之间实现数据共享。是应用程序间共享数据的唯一途径。Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。其中包括添加,删除,查询,更新等操作。 在Content Provider使用过程中,还需要借用ContentResolver对象间接来操作ContentProvider来获取数据。ContentResolver通过应用程序的getContentResolver()方法获得。一般情况下,ContentResolver是单实例的,但是可以有多个ContentResolver在不用的应用程序和不同的进程之间和ContentResolver交互。 二.Content Provider的简介 1.Content Provider的常用方法 //查询 query(Uri,String[],String,String[],String); //插入 insert(Uri,ContentValues); //更新 update(Uri,ContentValues,String,String[]); //删除 delete(Uri,String,String[]); //获得MIME数据类型 getType(Uri); 2.数据模型 Content Provider 将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个 "_ID" 数值字段,改字段唯一标识一条数据。 _ID NUMBER NUMBER_KEY LABEL NAME TYPE 13 (425) 555 6677 425 555 6677 Kirklandoffice Bully Pulpit TYPE_WORK 44 (212) 555-1234 212 555 1234 NY apartment Alan Vain TYPE_HOME 45 (212) 555-6657 212 555 6657 Downtown office Alan Vain TYPE_MOBILE 53 201.555.4433 201 555 4433 Love Nest Rex Cars TYPE_HOME 3.URI URI,每一个Content Provider 都对外提供一个能够唯一标识自己数据集(data set)的URI, 如果一个Content Provider管理多个数据集,其将会为每个数据集分配一个独立的URI。Content Provider就是通过URI对象来共享其数据的。 URI的格式图如下: 各个部分的组成: A:标准前缀,是固定的,"content://"是用来标识数据是由Content Provider管理的 schema。 B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称 C:需要访问的数据字段名称。 D:如果URI中包含表示需要获取的记录的_ID;如何有D部分,则就返回该_ID对应的数据,否则表示返回整张表的数据 三.Content Provider实例 Anroid系统自带的Content Provider对象 获得系统联系人信息(姓名和手机号码)的例子 MainActivity.java packagecom.lingdududu.provide; importandroid.app.Activity; importandroid.os.Bundle; importandroid.provider.ContactsContract; importandroid.provider.ContactsContract.PhoneLookup; importandroid.database.Cursor; importandroid.graphics.Color; importandroid.widget.TextView; importandroid.content.ContentResolver; publicclassMainActivityextendsActivity{ publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); TextViewtv=newTextView(this); Stringstring=getQueryData(); //设置文本的颜色 tv.setTextColor(Color.BLUE); //设置TextView显示的内容 tv.setText(string); //设置文本字体的大小 tv.setTextSize(30.0f); //显示到屏幕 setContentView(tv); } publicStringgetQueryData(){ Stringstring=""; //得到ContentResolver对象 ContentResolvercr=getContentResolver(); //取得电话本中开始一项的光标 Cursorcursor=cr.query(ContactsContract.Contacts.CONTENT_URI,null, null,null,null); //向下移动光标 while(cursor.moveToNext()){ //取得联系人名字 intnameFieldColumnIndex=cursor .getColumnIndex(PhoneLookup.DISPLAY_NAME); Stringcontact=cursor.getString(nameFieldColumnIndex); //取得电话号码 StringContactId=cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts._ID)); Cursorphone=cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=" +ContactId,null,null); while(phone.moveToNext()){ StringPhoneNumber=phone .getString(phone .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); string+=(contact+":"+PhoneNumber+"\n"); } } cursor.close(); returnstring; } } 注意:记得在AndroidManifest.xml加上17行的权限声明 <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.lingdududu.provide" android:versionCode="1" android:versionName="1.0"> <uses-sdkandroid:minSdkVersion="10"/> <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.READ_CONTACTS"/> </manifest> 通讯录中联系人的信息: 效果图: 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/667264

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

Android开发学习笔记:圆角的Button

在res目录下的drawable-mdpi建立xml文件shape.xml,如下图所示: shape.xml <?xmlversion="1.0"encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!--填充的颜色--> <solidandroid:color="#FFFFFF"/> <!--设置按钮的四个角为弧形--> <!--android:radius弧形的半径--> <cornersandroid:radius="5dip"/> <!--padding:Button里面的文字与Button边界的间隔--> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> main.xml 在android:background="@drawable/shape"就使用了shape.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" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/roundButton" android:text="圆角按钮" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/shape" /> </LinearLayout> strings.xml <?xmlversion="1.0"encoding="utf-8"?> <resources> <stringname="hello">HelloWorld,RoundButtonDemoActivity!</string> <stringname="app_name">RoundButtonDemo</string> </resources> RoundButtonDemoActivity.java packagecom.android.RoundButtonDemo.activity; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.Toast; publicclassRoundButtonDemoActivityextendsActivity{ ButtonroundButton; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); roundButton=(Button)findViewById(R.id.roundButton); //使用匿名类注册Button事件 roundButton.setOnClickListener(newOnClickListener() { publicvoidonClick(Viewv) { Toast.makeText(RoundButtonDemoActivity.this,"你点击了圆角按钮",Toast.LENGTH_LONG).show(); } }); } } 效果图: 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/630051

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

一次Hadoop开发思路分享

困扰了自己1周的一个问题终于得到解决了,感谢给我帮助的同学,同时记录下来分享给大家. 问题简化描述: HDFS存在这样格式的文件:用户ID主题ID用户对此主题的偏好分数score。 现在要求实现对给定的几个主题T1,T2,T3,...TN,每个主题要求筛选出指定数量的用户ID是M1,M2,M3,...MX。 希望尽可能根据score来选出偏好的用户ID,并且主题之间的用户ID不可以重复。 另外HDFS上distinct的用户ID数量是大于等于M1+M2+M3+...+MX的。 思路分析: 问题有几个关键点,第一,不重复,第二,数量上要满足,第三,偏好分数score。 如何保证,主题之间的用户不重复呢? 其实就是完成,一个用户只能属于一个主题的过程,当然,我们可以很简单的对一个用户下的所有偏好分数进行排序,取出最偏好的主题。 虽然这样避免了重复的问题,可是问题来了,如果偏好主题T1要求的数量是100W,而仅仅只有90W的用户ID对T1最偏好,这该如何补数呢?又如何通过程序来自动化的实现这个过程呢?越想越复杂! 这个问题好像有点类似于高考填自愿的问题,我们每一个人会填写几个志愿,但是我们终究只会被一个院校录取,这是怎么做到的呢?是否可以从中借鉴呢? 首先,我们根据HDFS的内容,写一个MapReduce完成一次计算,形成下面的用户志愿HDFS内容: 用户ID 主题ID-A:score1;主题ID-B:score2;... 很简单,希望得到一个用户ID下面按照score desc排序的主题列表,上面一行其实就是说: 用户ID的第一志愿是主题A,第二志愿是主题B...。 ------------------------------------------ 接下来,形成下面的一个列表list信息: 主题A count-A 主题B count-B 主题C count-C ... 按照主题需要的用户ID的数量进行ASC排序。 ------------------------------------------ 下面,我们就来看如何进行主题选择用户的过程: 我们首先选择对数量要求最少的主题A完成下面的MapReduce计算: 这样,我们就完成了主题A的用户筛选问题。 接下来,我们取出list中数量要求比A多一点的主题B,那么它怎么取用户呢? 很简单,我们只需要在MAP处理阶段,传递主题A生成的结果HDFS路径(路径下面的文件内容当然是主题A的用户)用于reduce阶段取用户时进行过滤。 那么,主题C又如何取用户呢? 类似的,只需要给MAP多传递主题A,主题B已经占用的用户信息用于过滤,其他处理操作不变! 其实,我们可以发现,上面的MapReduce其实可以是一个通用的程序,类似于COMMAND: hadoop jar XXX.jar 主题ID 数量 [input1,input2,input3,...] 用户志愿HDFS路径 输出路径 其中input1,input2,input3,...是可选的,其实就是用于用户过滤的。 最后,我们可以写一个Shell脚本,根据list的内容来进行重复调用上面的COMMAND,通过传递不同的参数信息达到目的,这样我们就可以自动化实现上面的要求了! 本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1689902,如需转载请自行联系原作者

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

android的互联网开发

一、java socket编程的介绍http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html 二、URL、UrlConnection网络编程介绍 三、HTTP网络编程介绍 http协议-简介http协议-C#获取网页源代码http协议-多线程文件传输 四、 Web Service网络编程介绍 五、 android WebView网络编程介绍 实例代码----------------------------------------------- 服务器端模拟 MyServer.java packagecom.amaker.socket; importjava.io.IOException; importjava.io.OutputStream; importjava.net.ServerSocket; importjava.net.Socket; /** * *Socket服务器,向客户端写HelloAndroid! */ publicclassMyServer{ publicstaticvoidmain(String[]args){ try{ ServerSocketserver=newServerSocket(8888); while(true){ Socketclient=server.accept(); OutputStreamout=client.getOutputStream(); Stringmsg="HelloAndroid!"; out.write(msg.getBytes()); client.close(); } }catch(IOExceptione){ e.printStackTrace(); } } } LoginServlet.java packagecom.amaker.http; importjava.io.IOException; importjava.io.PrintWriter; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; /** * *响应登录Servlet */ publicclassLoginServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ Stringusername=request.getParameter("username"); Stringpassword=request.getParameter("password"); System.out.println(username+":"+password); response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); Stringmsg=null; if(username!=null&&username.equals("admin")&&password!=null&&password.equals("1")){ msg="登录成功!"; }else{ msg="登录失败!"; } out.print(msg); out.flush(); out.close(); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doGet(request,response); } } web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.amaker.http.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/servlet/LoginServlet</url-pattern> </servlet-mapping> </web-app> android客户端 MainActivity.java packagecom.amaker.ch13; importandroid.app.ListActivity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.View; importandroid.widget.ArrayAdapter; importandroid.widget.ListView; importcom.amaker.ch13.http.LoginActivity; importcom.amaker.ch13.socket.TestSocketActivity; importcom.amaker.ch13.url.TestURLActivity; importcom.amaker.ch13.webservice.TestWebServiceActivity; importcom.amaker.ch13.webservice.WeatherActivity; importcom.amaker.ch13.webview.TestWebViewActivity; publicclassMainActivityextendsListActivity{ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //菜单项数组 String[]items={"测试Socket","测试URL、UrlConnection","测试HTTP","测试WebService","天气预报","TestWebView"}; //将菜单项数组设置为ListView的列表项展示 setListAdapter(newArrayAdapter<String>(this, android.R.layout.simple_list_item_1,items)); getListView().setTextFilterEnabled(true); } //响应菜单项的单击事件 protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){ Intentintent=null; switch(position){ case0: intent=newIntent(MainActivity.this,TestSocketActivity.class); startActivity(intent); break; case1: intent=newIntent(MainActivity.this,TestURLActivity.class); startActivity(intent); break; case2: intent=newIntent(MainActivity.this,LoginActivity.class); startActivity(intent); break; case3: intent=newIntent(MainActivity.this,TestWebServiceActivity.class); startActivity(intent); break; case4: intent=newIntent(MainActivity.this,WeatherActivity.class); startActivity(intent); break; case5: intent=newIntent(MainActivity.this,TestWebViewActivity.class); startActivity(intent); break; } } } AndroidManifest.xml <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.amaker.ch13" 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> <activityandroid:name="com.amaker.ch13.http.LoginActivity"/> <activityandroid:name="com.amaker.ch13.socket.TestSocketActivity"/> <activityandroid:name="com.amaker.ch13.url.TestURLActivity"/> <activityandroid:name="com.amaker.ch13.webservice.TestWebServiceActivity"/> <activityandroid:name="com.amaker.ch13.webservice.WeatherActivity"/> <activityandroid:name="com.amaker.ch13.webview.TestWebViewActivity"/> </application> <uses-sdkandroid:minSdkVersion="3"/> <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permissionandroid:name="android.permission.INTERNET"></uses-permission> </manifest> 一、socket编程 TestSocketActivity.java 代码 packagecom.amaker.ch13.socket; importjava.io.IOException; importjava.io.InputStream; importjava.net.Socket; importjava.net.UnknownHostException; importandroid.app.Activity; importandroid.os.Bundle; importandroid.widget.TextView; importcom.amaker.ch13.R; /** * *Android Socket客户端接收服务器信息 */ publicclassTestSocketActivityextendsActivity{ privateTextViewmyTextView; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.socket); myTextView=(TextView)findViewById(R.id.msgTextView01); try{ Socketsocket=newSocket("192.168.1.101",8888); InputStreamin=socket.getInputStream(); byte[]buffer=newbyte[in.available()]; in.read(buffer); Stringmsg=newString(buffer); myTextView.setText(msg); }catch(UnknownHostExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } } socket.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" > <TextView android:text="等待接收服务器信息..." android:id="@+id/msgTextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> </LinearLayout> 二、URL、UrlConnection编程 TestURLActivity.java 代码 packagecom.amaker.ch13.url; importjava.io.InputStream; importjava.net.URL; importjava.net.URLConnection; importandroid.app.Activity; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.os.Bundle; importandroid.widget.ImageView; importcom.amaker.ch13.R; /** *通过URL进行网络连接 */ publicclassTestURLActivityextendsActivity{ privateImageViewimageView; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.test_url); imageView=(ImageView)findViewById(R.id.ImageView01); StringurlStr="http://192.168.1.101:8080/Chapter_13_Networking_server/upload/zs.jpg"; try{ URLurl=newURL(urlStr); //1.直接使用URL获得输入流 //InputStreamin=url.openStream(); //2.获得URLconnection URLConnectionconn=url.openConnection(); InputStreamin=conn.getInputStream(); //3.如果是HTTP协议可以使用HttpURLConnection //HttpURLConnectionhttpConn=(HttpsURLConnection)conn; //in=httpConn.getInputStream(); Bitmapbm=BitmapFactory.decodeStream(in); imageView.setImageBitmap(bm); }catch(Exceptione){ e.printStackTrace(); } } } test_url.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" > <ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView> </LinearLayout> 三、 HTTP编程 LoginActivity.java 代码 packagecom.amaker.ch13.http; importjava.io.UnsupportedEncodingException; importjava.util.ArrayList; importjava.util.List; importorg.apache.http.HttpResponse; importorg.apache.http.NameValuePair; importorg.apache.http.client.entity.UrlEncodedFormEntity; importorg.apache.http.client.methods.HttpPost; importorg.apache.http.impl.client.DefaultHttpClient; importorg.apache.http.message.BasicNameValuePair; importorg.apache.http.protocol.HTTP; importorg.apache.http.util.EntityUtils; importandroid.app.Activity; importandroid.app.AlertDialog; importandroid.content.DialogInterface; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.EditText; importcom.amaker.ch13.R; publicclassLoginActivityextendsActivity{ /* *声明使用到的Button和EditText视图组件 */ privateButtoncancelBtn,loginBtn; privateEditTextuserEditText,pwdEditText; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.http1); /* *实例化视图组件 */ cancelBtn=(Button)findViewById(R.id.cancelButton); loginBtn=(Button)findViewById(R.id.loginButton); userEditText=(EditText)findViewById(R.id.userEditText); pwdEditText=(EditText)findViewById(R.id.pwdEditText); /* *设置登录监听器 */ loginBtn.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ Stringusername=userEditText.getText().toString(); Stringpwd=pwdEditText.getText().toString(); login(username,pwd); } }); /* *设置取消监听器 */ cancelBtn.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ finish(); } }); } /* *定义一个显示提示信息的对话框 */ privatevoidshowDialog(Stringmsg){ AlertDialog.Builderbuilder=newAlertDialog.Builder(this); builder.setMessage(msg) .setCancelable(false) .setPositiveButton("确定",newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog,intid){ } }); AlertDialogalert=builder.create(); alert.show(); } /* *通过用户名称和密码进行查询,发送Post请求,获得响应结果。 */ privatevoidlogin(Stringusername,Stringpassword){ //1.使用HttpURLConnection实现 /*StringurlStr="http://192.168.1.101:8080/Chapter_13_Networking_server/servlet/LoginServlet?"; StringqueryString="username="+username+"&password="+password; urlStr+=queryString; try{ URLurl=newURL(urlStr); HttpURLConnectionconn=(HttpURLConnection)url.openConnection(); if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){ InputStreamin=conn.getInputStream(); byte[]b=newbyte[in.available()]; in.read(b); Stringmsg=newString(b); showDialog(msg); in.close(); } conn.disconnect(); }catch(Exceptione){ showDialog(e.getMessage()); }*/ //2.使用ApacheHTTP客户端实现 StringurlStr="http://192.168.1.101:8080/Chapter_13_Networking_server/servlet/LoginServlet"; HttpPostrequest=newHttpPost(urlStr); //如果传递参数个数比较多的话,我们可以对传递的参数进行封装 List<NameValuePair>params=newArrayList<NameValuePair>(); params.add(newBasicNameValuePair("username",username)); params.add(newBasicNameValuePair("password",password)); try{ request.setEntity(newUrlEncodedFormEntity(params,HTTP.UTF_8)); HttpResponseresponse=newDefaultHttpClient().execute(request); if(response.getStatusLine().getStatusCode()==200){ Stringmsg=EntityUtils.toString(response.getEntity()); showDialog(msg); } }catch(Exceptione){ e.printStackTrace(); } } } 本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1079279

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

android的互联网开发

http1.xml <TableRow> <TextView android:text="用户密码:" android:id="@+id/TextView" android:layout_width="wrap_content" android:layout_height="wrap_content" ></TextView> <EditText android:text="" android:id="@+id/pwdEditText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:password="true"></EditText> </TableRow> <TableRowandroid:gravity="right"> <Button android:text="取消" android:id="@+id/cancelButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:text="登陆" android:id="@+id/loginButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </TableRow> </TableLayout> /LinearLayout> 四、Web Service编程 TestWebServiceActivity.java packagecom.amaker.ch13.webservice; importjava.io.IOException; importorg.ksoap2.SoapEnvelope; importorg.ksoap2.serialization.MarshalBase64; importorg.ksoap2.serialization.PropertyInfo; importorg.ksoap2.serialization.SoapObject; importorg.ksoap2.serialization.SoapSerializationEnvelope; importorg.ksoap2.transport.AndroidHttpTransport; importorg.xmlpull.v1.XmlPullParserException; importandroid.app.Activity; importandroid.os.Bundle; publicclassTestWebServiceActivityextendsActivity{ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); StringserviceNamespace="http://tempuri.org/"; StringserviceURL="http://www.ayandy.com/Service.asmx"; StringmethodName="getWeatherbyCityName"; SoapObjectrequest=newSoapObject(serviceNamespace,methodName); PropertyInfoinfo=newPropertyInfo(); info.setName("theCityName"); info.setValue("北京"); PropertyInfoinfo2=newPropertyInfo(); info2.setName("theDayFlag"); info2.setValue("1"); request.addProperty(info); request.addProperty(info2); SoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut=request; (newMarshalBase64()).register(envelope); AndroidHttpTransportht=newAndroidHttpTransport(serviceURL); ht.debug=true; try{ ht.call("http://tempuri.org/getWeatherbyCityName",envelope); if(envelope.getResponse()!=null){ System.out.println(envelope.getResult()); } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(XmlPullParserExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } WeatherActivity.java packagecom.amaker.ch13.webservice; importjava.util.List; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.widget.AdapterView; importandroid.widget.ArrayAdapter; importandroid.widget.Spinner; importandroid.widget.TextView; importandroid.widget.AdapterView.OnItemSelectedListener; importcom.amaker.ch13.R; /** * *显示天气预报 */ publicclassWeatherActivityextendsActivity{ //声明视图组件 privateTextViewdisplayTextView; privateSpinnerspinner; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.weather); //实例化视图组件 displayTextView=(TextView)findViewById(R.id.displayTextView03); spinner=(Spinner)findViewById(R.id.citySpinner01); List<String>citys=WebServiceUtil.getCityList(); ArrayAdaptera=newArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item,citys); spinner.setAdapter(a); spinner.setOnItemSelectedListener(newOnItemSelectedListener(){ @Override publicvoidonItemSelected(AdapterView<?>arg0,Viewarg1, intarg2,longarg3){ Stringmsg=WebServiceUtil.getWeatherMsgByCity(spinner.getSelectedItem().toString()); displayTextView.setText(msg); } @Override publicvoidonNothingSelected(AdapterView<?>arg0){ } }); } } WebServiceUtil.java packagecom.amaker.ch13.webservice; importjava.io.IOException; importjava.io.InputStream; importjava.util.ArrayList; importjava.util.List; importjavax.xml.parsers.DocumentBuilder; importjavax.xml.parsers.DocumentBuilderFactory; importorg.apache.http.HttpResponse; importorg.apache.http.NameValuePair; importorg.apache.http.client.entity.UrlEncodedFormEntity; importorg.apache.http.client.methods.HttpPost; importorg.apache.http.impl.client.DefaultHttpClient; importorg.apache.http.message.BasicNameValuePair; importorg.apache.http.protocol.HTTP; importorg.apache.http.util.EntityUtils; importorg.ksoap2.SoapEnvelope; importorg.ksoap2.serialization.MarshalBase64; importorg.ksoap2.serialization.SoapObject; importorg.ksoap2.serialization.SoapSerializationEnvelope; importorg.ksoap2.transport.AndroidHttpTransport; importorg.w3c.dom.Document; importorg.w3c.dom.Element; importorg.w3c.dom.Node; importorg.w3c.dom.NodeList; importorg.xmlpull.v1.XmlPullParserException; /** * *天气预报工具类 */ publicclassWebServiceUtil{ /* *通过传递城市名称获得天气信息 */ publicstaticStringgetWeatherMsgByCity(StringcityName){ Stringurl="http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather"; HttpPostrequest=newHttpPost(url); List<NameValuePair>params=newArrayList<NameValuePair>(); params.add(newBasicNameValuePair("theCityCode",cityName)); params.add(newBasicNameValuePair("theUserID","")); Stringresult=null; try{ UrlEncodedFormEntityentity=newUrlEncodedFormEntity(params, HTTP.UTF_8); request.setEntity(entity); HttpResponseresponse=newDefaultHttpClient().execute(request); if(response.getStatusLine().getStatusCode()==200){ result=EntityUtils.toString(response.getEntity()); returnparse2(result); } }catch(Exceptione){ e.printStackTrace(); } returnnull; } /* *使用ksoap,获得城市列表 */ publicstaticList<String>getCityList(){ //命名空间 StringserviceNamespace="http://WebXml.com.cn/"; //请求URL StringserviceURL="http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx"; //调用的方法 StringmethodName="getRegionProvince"; //实例化SoapObject对象 SoapObjectrequest=newSoapObject(serviceNamespace,methodName); //获得序列化的Envelope SoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope( SoapEnvelope.VER11); envelope.bodyOut=request; (newMarshalBase64()).register(envelope); //Android传输对象 AndroidHttpTransportht=newAndroidHttpTransport(serviceURL); ht.debug=true; try{ //调用 ht.call("http://WebXml.com.cn/getRegionProvince",envelope); if(envelope.getResponse()!=null){ returnparse(envelope.bodyIn.toString()); } }catch(IOExceptione){ e.printStackTrace(); }catch(XmlPullParserExceptione){ e.printStackTrace(); } returnnull; } /* *对天气信息XML文件进行解析 */ privatestaticStringparse2(Stringstr){ Stringtemp; String[]temps; Listlist=newArrayList(); StringBuildersb=newStringBuilder(""); if(str!=null&&str.length()>0){ temp=str.substring(str.indexOf("<string>")); temptemps=temp.split("</string>"); for(inti=0;i<temps.length;i++){ sb.append(temps[i].substring(12)); sb.append("\n"); } } returnsb.toString(); } /* *对得到的城市XML信息进行解析 */ privatestaticList<String>parse(Stringstr){ Stringtemp; List<String>list=newArrayList<String>(); if(str!=null&&str.length()>0){ intstart=str.indexOf("string"); intend=str.lastIndexOf(";"); temp=str.substring(start,end-3); String[]test=temp.split(";"); for(inti=0;i<test.length;i++){ if(i==0){ temp=test[i].substring(7); }else{ temp=test[i].substring(8); } intindex=temp.indexOf(","); list.add(temp.substring(0,index)); } } returnlist; } } weather.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"> <TextView android:text="天气预报" android:id="@+id/titleTextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:text="请选择城市:" android:id="@+id/cityTextView02" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <Spinner android:id="@+id/citySpinner01" android:layout_width="fill_parent" android:layout_height="wrap_content"></Spinner> </LinearLayout> <ScrollView android:id="@+id/ScrollView01" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:text="@+id/displayTextView03" android:id="@+id/displayTextView03" android:layout_width="fill_parent" android:layout_height="fill_parent"></TextView> </ScrollView> </LinearLayout> 五、WebView编程 TestWebViewActivity.java packagecom.amaker.ch13.webview; importandroid.app.Activity; importandroid.os.Bundle; importandroid.webkit.WebView; importcom.amaker.ch13.R; /** *通过WebView浏览网络 */ publicclassTestWebViewActivityextendsActivity{ privateWebViewwebView; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.test_webview); webView=(WebView)findViewById(R.id.mywebview); /*Stringurl="http://www.google.com"; webView.loadUrl(url);*/ Stringhtml=""; html+="<html>"; html+="<body>"; html+="<ahref=http://www.google.com>GoogleHome</a>"; html+="</body>"; html+="</html>"; webView.loadData(html,"text/html","utf-8"); } } test_webview.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" > <WebView android:id="@+id/mywebview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1079312

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

Android开发之OkHttp3.4.x

HTTP是现代应用程序访问网络的一种方式。网络中很多请求就是使用的http方式,来访问网络的。 Android从4.4开始,HttpUrlConnection开始使用okhttp作为底层实现。实现原理如下图: 这篇博客简单说一下okhttp的使用。文字部分没有讲清楚的,可以查看代码里面的注释。首先看一下okHttp怎么工作的。 首先我们看看一个okhttp完整的网络访问,都涉及到了那几个类(这里先说核心类)。 1.OkHttpClient: Call类的工厂,Call是用来发送网络请求和接收服务器响应的类。这个类实例可以设置拦截器,缓存大小,缓存目录,连接池等信息。 2.Request:是用来创建http请求,这个请求里面可以设置请求头信息,网络访问地址,请求方式(GET,POST,DELETE,PUT)等。 3.Call:一个接口,一个准备执行的请求。 具体代码: 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 /** *首先构建OkHttpClient,<br/> *1.方法:直接使用new关键字创建 *2.方法:使用构造着模式,OkHttpClient.Builder.build方法构造。 *这个类是用来配置和创建HTTP连接。在大多数的程序中,这个类可以封装成一个单利模式 *来进行程序网络访问的统一管理。 *设置共享的响应缓存、线程池、连接复用 *(要设置这些东西,请使用官方提供的方法,OkHttpClient.Builder来设置缓存目录、缓存大小, *配置连接池, *配置拦截器, *) *然后构建Request请求对象<br/> *request对象只能使用Request.Builder.build来创建对象。 *最后Call,使用httpClient.newCall(request)来生成一个执行对象。 *用call对象,调用execute方法,执行网络请求 **/ Filefile= new File(Environment.getDataDirectory().getAbsolutePath()+File.pathSeparator+ "http_cache" ); final Cachecache= new Cache(file, 20000 ); //最大的闲置连接数量, ConnectionPoolpool= new ConnectionPool( 10 , 5 ,TimeUnit.SECONDS); //call的工厂类,Call是用来发送请求和接收响应的类 OkHttpClienthttpClient= new OkHttpClient.Builder().addInterceptor( new Interceptor(){ @Override public Responseintercept(Chainchain) throws IOException{ //请求时的参数 Responseresponse=chain.proceed(chain.request()); okhttp3.MediaTypemediaType=response.body().contentType(); //响应体 Stringcontent=response.body().string(); return response.newBuilder() .body(okhttp3.ResponseBody.create(mediaType,content)) .build(); } //这只连接池,缓存 }).connectionPool(pool).cache(cache).build(); //这里面来设置网络访问的头信息,以及访问的网络地址,这里默认使用get方式请求 Requestrequest= new Request.Builder().url( "https://www.baidu.com" ).build(); Callcall=httpClient.newCall(request); call.enqueue( new Callback(){ @Override public void onFailure(Callcall,IOExceptione){ Log.d( "--MainActivity--" , "onFailure:---网络访问失败" ); } @Override public void onResponse(Callcall,Responseresponse) throws IOException{ //这个方法在网络访问成功之后回执行。response响应体,实例里封装了服务器返回的数据。 //最常用的就是body(),服务器返回的数据(ResponseBody)。这个ResponseBody里面是服务器具体返回的数据 //如果是返回的字符串则用string()方法。如果是流,则byteStream(),字节数组bytes(). Log.d( "--MainActivity--" , "onResponse:" +response.body().string()); } }); 这样一个完整的网络访问就完成了。 使用到得权限: <uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 注:okhttp源码:https://github.com/square/okhttp 本文转自 墨宇hz 51CTO博客,原文链接:http://blog.51cto.com/zzhhz/1879372

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

hadoop mapreduce开发实践文件合并(join)

有两份不同的文件,他们有相同的键,把他们合并成一个文件; 1、文件内容 合并前的文件a.txt和b.txt $ head a.txt b.txt ==> a.txt <== aaa1 hdfs aaa2 hdfs aaa3 hdfs aaa4 hdfs aaa5 hdfs aaa6 hdfs aaa7 hdfs aaa8 hdfs aaa9 hdfs aaa10 hdfs ==> b.txt <== aaa1 mapreduce aaa2 mapreduce aaa3 mapreduce aaa4 mapreduce aaa5 mapreduce aaa6 mapreduce aaa7 mapreduce aaa8 mapreduce aaa9 mapreduce aaa10 mapreduce 2、思路 1)、首先分别对a.txt和b.txt做一个map标签处理(用于区分a.txt和b.txt上的数据); 2)、mapjoin用于输出做过标签处理的a.txt和b.txt; 3)、用一个reducejoin的程序做类似wordcount处理,相同的key放在一起,把a.txt和b.txt上的value放在key后面输出; 3、实现 3.1、创建目录和上传数据 $ hadoop fs -mkdir /input/join $ hadoop fs -mkdir /output/join/ $ hadoop fs -put a.txt b.txt /input/join 3.2、 mapperA程序 #!/usr/bin/env python # -*- conding:utf-8 -*- import sys def mapper(): for line in sys.stdin: wordline = line.strip().split() wordkey = wordline[0] wordvalue = wordline[1] #print wordline print "%s\ta\t%s" % (wordkey, wordvalue) if __name__ == "__main__": mapper() 3.3、mapperB程序 #!/usr/bin/env python # -*- conding:utf-8 -*- import sys def mapper(): for line in sys.stdin: wordline = line.strip().split() wordkey = wordline[0] wordvalue = wordline[1] print "%s\tb\t%s" % (wordkey, wordvalue) if __name__ == "__main__": mapper() 3.4、mapperjoin程序 #!/usr/bin/env python # -*- conding:utf-8 -*- import sys def mapper(): for line in sys.stdin: print line.strip() if __name__ == "__main__": mapper() 3.5、reducerjoin程序 #!/usr/bin/env python # -*- conding:utf-8 -*- import sys def reducer(): valueA = '' for line in sys.stdin: wordkey, flag, wordvalue = line.strip().split('\t') if flag == 'a': valueA = wordvalue elif flag == 'b': valueB = wordvalue print "%s\t%s\t%s" % (wordkey,valueA,valueB) valueA = '' if __name__ == "__main__": reducer() 3.6、run_streaming程序 #!/bin/bash HADOOP_CMD="/home/hadoop/app/hadoop/hadoop-2.6.0-cdh5.13.0/bin/hadoop" STREAM_JAR_PATH="/home/hadoop/app/hadoop/hadoop-2.6.0-cdh5.13.0/share/hadoop/tools/lib/hadoop-streaming-2.6.0-cdh5.13.0.jar" INPUT_FILE_PATH_A="/input/join/a.txt" INPUT_FILE_PATH_B="/input/join/b.txt" OUTPUT_FILE_PATH_A="/output/join/a" OUTPUT_FILE_PATH_B="/output/join/b" OUTPUT_FILE_JOIN_PATH="/output/join/abjoin" $HADOOP_CMD fs -rmr -skipTrash $OUTPUT_FILE_PATH_A $HADOOP_CMD fs -rmr -skipTrash $OUTPUT_FILE_PATH_B $HADOOP_CMD fs -rmr -skipTrash $OUTPUT_FILE_JOIN_PATH # step1: map a $HADOOP_CMD jar $STREAM_JAR_PATH \ -input $INPUT_FILE_PATH_A \ -output $OUTPUT_FILE_PATH_A \ -jobconf "mapred.job.name=joinfinemapA" \ -mapper "python mapperA.py" \ -file "./mapperA.py" # step2: map b $HADOOP_CMD jar $STREAM_JAR_PATH \ -input $INPUT_FILE_PATH_B \ -output $OUTPUT_FILE_PATH_B \ -jobconf "mapred.job.name=joinfinemapB" \ -mapper "python mapperB.py" \ -file "./mapperB.py" # step3: join $HADOOP_CMD jar $STREAM_JAR_PATH \ -input $OUTPUT_FILE_PATH_A,$OUTPUT_FILE_PATH_B \ -output $OUTPUT_FILE_JOIN_PATH \ -mapper "python mapperjoin.py" \ -reducer "python reducerjoin.py" \ -jobconf "mapred.job.name=joinfinemapAB" \ -jobconf "stream.num.map.output.key.fields=2" \ -jobconf "num.key.fields.for.partition=1" \ -file "./reducerjoin.py" \ -file "./mapperjoin.py" 3.7、执行程序 $ ./run_streamingab.sh ...中间省略... 18/02/05 10:43:13 INFO streaming.StreamJob: Output directory: /output/join/a ...中间省略... 18/02/05 10:43:42 INFO streaming.StreamJob: Output directory: /output/join/b ...中间省略... 18/02/05 10:44:12 INFO streaming.StreamJob: Output directory: /output/join/abjoin 3.8、查看结果 $ hadoop fs -ls /output/join/abjoin Found 2 items -rw-r--r-- 1 hadoop supergroup 0 2018-02-05 10:44 /output/join/abjoin/_SUCCESS -rw-r--r-- 1 hadoop supergroup 6276 2018-02-05 10:44 /output/join/abjoin/part-00000 $ hadoop fs -text /output/join/abjoin/part-00000|head aaa1 hdfs mapreduce aaa10 hdfs mapreduce aaa100 hdfs mapreduce aaa11 hdfs mapreduce aaa12 hdfs mapreduce aaa13 hdfs mapreduce aaa14 hdfs mapreduce aaa15 hdfs mapreduce aaa16 hdfs mapreduce aaa17 hdfs mapreduce 4、hadoop streaming 语法参考 http://blog.51cto.com/balich/2065419 本文转自 巴利奇 51CTO博客,原文链接:http://blog.51cto.com/balich/2068884

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

iOS开发 ARC下dealloc的使用

在MRC时代,我们需要在 dealloc中做很多,比如释放对象,等等; 如今我们已经进入ARC时代,对于普通对象的释放,系统已经帮我们做好了; 那是否可以高枕无忧了呢?在ARC下我们应该做什么? 观点: ARC下,系统可以帮我们释放该对象,及其包含的对象; 但是却无法释放不属于该对象的一些东西,如: 1.通知的观察者,或KVO的观察者 由于通知中心是系统的一个单例,你在注册通知的观察者时,实际上是在通知中心注册的, 这时,即使ARC下系统帮我们释放了对象,但是在通知中心的观察还是没有移除,那么当有 该通知时,依然会尝试调用该对象的接受通知的方法,这可能会导致一些问题. 这一点有点像,你晚上六点下班了...但是却没有刷卡..., 2.对象强委托/引用的解除(例如XMPPMannerger的delegateQueue) 对于其他的对象来把你当做委托 delegate时,并且是 强引用时,即时你自身被释放,但是引用你的对象依然还在, 这时需要在引用你的对象移除该delegate 3.做一些其他的注销之类的操作(关闭程序运行期间没有关闭的资源) 一个对象,如一个ViewController在销毁之前有可能需要和server打交道; 这时我们也可以在dealloc中写 关于dealloc的底层实现,可以参照objc运行时代码 示例,ARC下我们应该做的: [html]view plaincopy -(void)dealloc { [[NSNotificationCenterdefaultCenter]removeObserver:self];//移除通知观察者 [[XMPPManagersharedManager]removeFromDelegateQueue:self];//移除委托引用 [[MyClassshareInstance]doSomething]//其他操作 } ARC下我们没必要做的 [html]view plaincopy -(void)dealloc { _name=nil; [_timeinvalid]; } [html]view plaincopy 总结:dealloc在ARC下的作用就是释放系统无法释放的该对象占用的资源,或者其他对象对该对象的引用. 原文出自:http://blog.csdn.net/yangbingbinga/ 本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1871811,如需转载请自行联系原作者

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

【移动开发】Android Animation 动画效果总结

1.Android的animation由四种类型组成: XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 JavaCode中 AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸伸缩动画效果 TranslateAnimation 画面转换位置移动动画效果 RotateAnimation 画面转移旋转动画效果 2.Animation主要有两种动画模式: 一种是tweened animation(渐变动画) XML中 JavaCode alpha AlphaAnimation scale ScaleAnimation 一种是frame by frame(画面转换动画) XML中 JavaCode translate TranslateAnimation rotate RotateAnimation 3.如何在XML文件中定义动画 ① 打开Eclipse,新建Android工程 ② 在res目录中新建anim文件夹 ③ 在anim目录中新建一个myanim.xml(注意文件名小写) ④ 加入XML的动画代码 1 2 3 4 5 6 7 <?xml version= "1.0" encoding= "utf-8" ?> < set xmlns:android= "http://schemas.android.com/apk/res/android" > <alpha/> <scale/> <translate/> <rotate/> </ set > 4.Android动画解析--XML <alpha> 透明度 1 2 3 4 5 6 7 8 <?xml version= "1.0" encoding= "utf-8" ?> < set xmlns:android= "http://schemas.android.com/apk/res/android" > <alpha android:fromAlpha= "0.1" android:toAlpha= "1.0" android:duration= "3000" /> </ set > 注释: fromAlpha(浮点型值) 属性为动画起始时透明度, 0.0表示完全透明 toAlpha(浮点型值) 属性为动画结束时透明度, 1.0表示完全不透明. fromAlpha 和 toAlpha 的取值在0.0-1.0之间的float数据类型的数字 duration(长整型值) 属性为动画持续时间,时间以毫秒为单位 <scale> 缩放 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?xml version= "1.0" encoding= "utf-8" ?> < set xmlns:android= "http://schemas.android.com/apk/res/android" > <scale android:interpolator= "@android:anim/accelerate_decelerate_interpolator" android:fromXScale= "0.0" android:toXScale= "1.4" android:fromYScale= "0.0" android:toYScale= "1.4" android:pivotX= "50%" android:pivotY= "50%" android:fillAfter= "false" android:duration= "700" /> </ set > 注释: interpolator 指定一个动画的插入器在我试验过程中,使用android.res.anim中的资源时候发现有三种动画插入器: accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 A.浮点型值: fromXScale 属性为动画起始时 X坐标上的伸缩尺寸 toXScale 属性为动画结束时 X坐标上的伸缩尺寸 fromYScale 属性为动画起始时Y坐标上的伸缩尺寸 toYScale 属性为动画结束时Y坐标上的伸缩尺寸 说明: 0.0表示收缩到没有,1.0表示正常无伸缩 值小于1.0表示收缩,值大于1.0表示放大 pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 说明: 以上两个属性值 从0%-100%中取值 50%为物件的X或Y方向坐标上的中点位置 B.长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 C.布尔型值: fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用 <translate> 移动 1 2 3 4 5 6 7 8 9 10 <?xml version= "1.0" encoding= "utf-8" ?> < set xmlns:android= "http://schemas.android.com/apk/res/android" > <translate android:fromXDelta= "30" android:toXDelta= "-80" android:fromYDelta= "30" android:toYDelta= "300" android:duration= "2000" /> </ set > 注释: 整型值: fromXDelta 属性为动画起始时 X坐标上的位置 toXDelta 属性为动画结束时 X坐标上的位置 fromYDelta 属性为动画起始时 Y坐标上的位置 toYDelta 属性为动画结束时 Y坐标上的位置 注意: 没有指定fromXType toXType fromYType toYType 时候,默认是以自己为相对参照物 长整型值: duration 属性为动画持续时间,时间以毫秒为单位 <rotate> 旋转 1 2 3 4 5 6 7 8 9 10 <?xml version= "1.0" encoding= "utf-8" ?> < set xmlns:android= "http://schemas.android.com/apk/res/android" > <rotate android:interpolator= "@android:anim/accelerate_decelerate_interpolator" android:fromDegrees= "0" android:toDegrees= "+350" android:pivotX= "50%" android:pivotY= "50%" android:duration= "3000" /> </ set > 注释: 属性:interpolator 指定一个动画的插入器有三种动画插入器: accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 A.浮点数型值: fromDegrees 属性为动画起始时物件的角度 toDegrees 属性为动画结束时物件旋转的角度 可以大于360度 说明: 当角度为负数——表示逆时针旋转 当角度为正数——表示顺时针旋转 (负数from——to正数:顺时针旋转) (负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转) pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 说明: 以上两个属性值 从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置 B.长整型值: duration 属性为动画持续时间,时间以毫秒为单位 如何使用XML中的动画效果 1 2 3 4 5 6 7 8 /** *Context 为程序的上下文 *id 为动画XML文件的引用 **/ public static Animation loadAnimation (Context context, int id) //例子: myAnimation= AnimationUtils.loadAnimation( this ,R.anim.my_action); //使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件 5.Android动画解析--JavaCode A.AlphaAnimation ① AlphaAnimation类对象定义 1 private AlphaAnimation myAnimation_Alpha; ② AlphaAnimation类对象构造 1 2 3 4 5 6 7 AlphaAnimation(float fromAlpha, float toAlpha) //第一个参数fromAlpha为 动画开始时候透明度 //第二个参数toAlpha为 动画结束时候透明度 myAnimation_Alpha= new AlphaAnimation( 0 .1f, 1 .0f); //说明: // 0.0表示完全透明 // 1.0表示完全不透明 1 2 myAnimation_Alpha.setDuration( 5000 ); //设置时间持续时间为 5000毫秒 ③ 设置动画持续时间 1 2 myAnimation_Alpha.setDuration( 5000 ); //设置时间持续时间为 5000毫秒 B.ScaleAnimation ① ScaleAnimation类对象定义 1 private AlphaAnimation myAnimation_Alpha; ② ScaleAnimation类对象构造 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) //第一个参数fromX为动画起始时 X坐标上的伸缩尺寸 //第二个参数toX为动画结束时 X坐标上的伸缩尺寸 //第三个参数fromY为动画起始时Y坐标上的伸缩尺寸 //第四个参数toY为动画结束时Y坐标上的伸缩尺寸 /*说明: 以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 */ //第五个参数pivotXType为动画在X轴相对于物件位置类型 //第六个参数pivotXValue为动画相对于物件的X坐标的开始位置 //第七个参数pivotXType为动画在Y轴相对于物件位置类型 //第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置 myAnimation_Scale = new ScaleAnimation( 0 .0f, 1 .4f, 0 .0f, 1 .4f, Animation.RELATIVE_TO_SELF, 0 .5f, Animation.RELATIVE_TO_SELF, 0 .5f); ③ 设置动画持续时间 1 2 myAnimation_Scale.setDuration( 700 ); //设置时间持续时间为 700毫秒 C.TranslateAnimation ① TranslateAnimation类对象定义 1 private AlphaAnimation myAnimation_Alpha; ② TranslateAnimation类对象构造 1 2 3 4 5 6 TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) //第一个参数fromXDelta为动画起始时 X坐标上的移动位置 //第二个参数toXDelta为动画结束时 X坐标上的移动位置 //第三个参数fromYDelta为动画起始时Y坐标上的移动位置 //第四个参数toYDelta为动画结束时Y坐标上的移动位置 ③ 设置动画持续时间 1 2 myAnimation_Translate.setDuration( 2000 ); //设置时间持续时间为 2000毫秒 D.RotateAnimation ① RotateAnimation类对象定义 1 private AlphaAnimation myAnimation_Alpha; ② RotateAnimation类对象构造 1 2 3 4 5 6 7 8 9 10 RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) //第一个参数fromDegrees为动画起始时的旋转角度 //第二个参数toDegrees为动画旋转到的角度 //第三个参数pivotXType为动画在X轴相对于物件位置类型 //第四个参数pivotXValue为动画相对于物件的X坐标的开始位置 //第五个参数pivotXType为动画在Y轴相对于物件位置类型 //第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置 myAnimation_Rotate= new RotateAnimation( 0 .0f, + 350 .0f, Animation.RELATIVE_TO_SELF, 0 .5f,Animation.RELATIVE_TO_SELF, 0 .5f); ③ 设置动画持续时间 1 2 myAnimation_Rotate.setDuration( 3000 ); //设置时间持续时间为 3000毫秒 如何使用Java代码中的动画效果 使用从View父类继承过来的方法startAnimation()来为View或是子类View等等添加一个动画效果 1 public void startAnimation (Animation animation) 恩恩!差不多完了,这样看着爽多了哈~ 本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1249022,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Spring

Spring

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

用户登录
用户注册