編輯:Android開發實例
實現一個簡單的手機博客客戶端的開發
本程序暫時實現以下的功能:
1、首先實現一個去服務器獲取一串xml的數據,然後顯示到界面上
2、點擊圖片可以放大查看
最終效果如下:
1、首先把界面寫出來,使用listView
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <ListView
- android:id="@+id/blogLV"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- </ListView>
- </LinearLayout>
2.item的界面
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal" >
- <ImageView
- android:id="@+id/portraitIV"
- android:layout_width="50dp"
- android:layout_height="50dp"
- />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:padding="5dp" >
- <TextView
- android:id="@+id/nameTV"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="2dp"
- android:text="姓名"
- android:textSize="20sp" />
- <TextView
- android:id="@+id/contentTV"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="2dp"
- android:textSize="15sp" />
- <ImageView
- android:id="@+id/picIV"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="2dp"
- android:adjustViewBounds="true"
- android:maxHeight="100dp"
- android:maxWidth="100dp" />
- <TextView
- android:id="@+id/fromTV"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="2dp"
- android:textColor="#55FFFFFF"
- android:text="來自新浪博客"
- android:textSize="15sp" />
- </LinearLayout>
- </LinearLayout>
3、步入正題blog.java
- package cn.itcast.blog;
- public class Blog {
- private String portrait;
- private String name;
- private String content;
- private String pic;
- private String from;
- public Blog() {
- super();
- }
- public Blog(String portrait, String name, String content, String pic,
- String from) {
- super();
- this.portrait = portrait;
- this.name = name;
- this.content = content;
- this.pic = pic;
- this.from = from;
- }
- public String getPortrait() {
- return portrait;
- }
- public void setPortrait(String portrait) {
- this.portrait = portrait;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getContent() {
- return content;
- }
- public void setContent(String content) {
- this.content = content;
- }
- public String getPic() {
- return pic;
- }
- public void setPic(String pic) {
- this.pic = pic;
- }
- public String getFrom() {
- return from;
- }
- public void setFrom(String from) {
- this.from = from;
- }
- @Override
- public String toString() {
- return "Blog [portrait=" + portrait + ", name=" + name + ", content="
- + content + ", pic=" + pic + ", from=" + from + "]";
- }
- }
4.主界面mainActivity
- package cn.itcast.blog;
- import java.util.List;
- import android.app.Activity;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ImageView;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
- public class mainActivity extends Activity {
- private ListView blogLV;
- private List<Blog> blogs;
- private ImageService imageService;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- try {
- imageService = new ImageService(getApplicationContext()); // 圖片業務類
- BlogService blogservice=new BlogService(); // 博客業務類
- blogs = blogservice.getBlogs(); // 獲取博客數據
- blogLV = (ListView) this.findViewById(R.id.blogLV); // 獲取ListView
- blogLV.setAdapter(adapter); //設置適配器,構建界面
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- Toast.makeText(this, "服務器忙", 0).show();
- }
- }
- //創建出來一個adapter,構建出了一個界面
- private BaseAdapter adapter=new BaseAdapter() {
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- //用blog中的數據來替換view中的數據
- View view =convertView==null?View.inflate(getApplicationContext(), R.layout.item, null):convertView;
- ImageView portraitIV = (ImageView) view.findViewById(R.id.portraitIV);
- TextView nameTV = (TextView) view.findViewById(R.id.nameTV);
- TextView contentTV = (TextView) view.findViewById(R.id.contentTV);
- ImageView picIV = (ImageView) view.findViewById(R.id.picIV);
- TextView fromTV = (TextView) view.findViewById(R.id.fromTV);
- final Blog blog = blogs.get(position); // 獲取指定位置上的博客
- nameTV.setText(blog.getName()); // 設置文本數據
- contentTV.setText(blog.getContent());
- fromTV.setText(blog.getFrom());
- //設置圖片資源的顯示位置
- try {
- portraitIV.setImageBitmap(imageService.getImage(blog.getPortrait())); // 根據地址獲取圖片, 設置圖片
- } catch (Exception e) {
- e.printStackTrace();
- }
- //設置一個功能是實現圖片點擊放大的功能
- try {
- picIV.setImageBitmap(imageService.getImage(blog.getPic()));
- picIV.setOnClickListener(new OnClickListener() {//創建一個匿名內部類
- public void onClick(View v) {
- Intent intent=new Intent();//注冊一個意圖
- intent.setAction(Intent.ACTION_VIEW);
- intent.setData(Uri.parse(blog.getPic()));//解析一個地址
- startActivity(intent);
- }
- });
- } catch (Exception e) {
- e.printStackTrace();
- }
- return view;
- }
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return 0;
- }
- @Override
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return blogs.size();//這個要返回一個blogs的長度
- }
- };
- }
5.
imageService
- package cn.itcast.blog;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.net.URLEncoder;
- import android.accounts.NetworkErrorException;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.Bitmap.CompressFormat;
- import android.graphics.BitmapFactory;
- public class ImageService {
- private Context context;
- // 創造它的構造函數
- public ImageService(Context context) {
- this.context = context;
- }
- // 寫一個獲取圖片的方法
- public Bitmap getImage(String address) throws Exception {
- // 1.判斷是否有圖片的資源,如果沒有的話直接返回空
- if (address == null)
- return null;
- // 2、獲得地址,然後打開連接
- URL url = new URL(address);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 獲得連接對象
- // ,然後打開連接
- conn.setConnectTimeout(3000);// 設置超時時間
- // 8、緩存文件
- File cacheFile = new File(context.getCacheDir(),
- URLEncoder.encode(address));// 緩存文件
- if (cacheFile.exists())// 9、判斷是否有緩存文件存在
- conn.setIfModifiedSince(cacheFile.lastModified());// 10、發送緩存文件的最後修改時間
- // 3、獲得狀態碼,判斷是否為緩存文件
- int code = conn.getResponseCode();// 獲得狀態碼
- if (code == 200) { // 4.如果請求成功,那麼就開始讀取網路數據
- byte[] data = Util.read(conn.getInputStream());
- // 5、使用BitmapFactory方法把讀取到的字符轉化為圖片
- Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
- writeCache(cacheFile, bm); // 6、開啟新線程,寫出圖片到本地。
- return bm;
- } else if (code == 304) {
- // 7、讀取本地數據,轉化為圖片
- return BitmapFactory.decodeFile(cacheFile.getAbsolutePath());
- }
- throw new NetworkErrorException("訪問服務器出錯:" + code);
- }
- // 開啟新線程來寫圖片緩存
- private void writeCache(final File cacheFile, final Bitmap bm) {
- // 開啟新線程
- new Thread() {
- public void run() {
- try {
- FileOutputStream fos = new FileOutputStream(cacheFile);
- bm.compress(CompressFormat.JPEG, 100, fos);// 轉存到本地
- fos.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- throw new RuntimeException(e);
- }
- };
- }.start();
- }
- }
6.blogService
- package cn.itcast.blog;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.List;
- import org.xmlpull.v1.XmlPullParser;
- import android.accounts.NetworkErrorException;
- import android.util.Xml;
- public class BlogService {
- public List<Blog> getBlogs() throws Exception{//業務類把錯誤拋出去
- URL url=new URL("http://192.168.1.126/Myweb/blogs.xml"); //1、指定服務端地址
- HttpURLConnection conn=(HttpURLConnection) url.openConnection(); //2、打開連接對象
- conn.setConnectTimeout(3000);//設置超時時間為3秒 3、設置超時時間
- //下一步開始判斷返回值
- int code=conn.getResponseCode(); //4、從服務端讀取數據,解析xml
- if(code==200){
- //創建一個方法,通過輸入流來解析xml
- return parseBlog(conn.getInputStream());
- }
- throw new NetworkErrorException("連接失敗:"+code);
- }
- //解析xml對象
- private List<Blog> parseBlog(InputStream inputStream) throws Exception {
- // TODO Auto-generated method stub
- XmlPullParser parser=Xml.newPullParser();
- parser.setInput(inputStream, "UTF-8");
- List<Blog> blogs=new ArrayList<Blog>();
- Blog blog=null;
- //解析xml文件
- for(int type=parser.getEventType();type!=XmlPullParser.END_DOCUMENT;type=parser.next()){
- //解析
- if(type==XmlPullParser.START_TAG){
- if("blog".equals(parser.getName())){
- blog=new Blog();//如果是它我就創建對象,然後放進去
- blogs.add(blog);
- }else if("portrait".equals(parser.getName())){
- blog.setPortrait(parser.nextText());
- }else if("name".equals(parser.getName())){
- blog.setName(parser.nextText());
- }else if("content".equals(parser.getName())){
- blog.setContent(parser.nextText());
- }else if("pic".equals(parser.getName())){
- blog.setPic(parser.nextText());
- }else if("from".equals(parser.getName())){
- blog.setFrom(parser.nextText());
- }
- }
- }
- return blogs;//如果xml裡面什麼都沒有 ,那麼就返回blog
- }
- }
7.util
- package cn.itcast.blog;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- public class Util {
- public static byte[] read(InputStream in) throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int len;
- while ((len = in.read(buffer)) != -1)
- baos.write(buffer, 0, len);
- baos.close();
- byte[] data = baos.toByteArray();
- return data;
- }
- }
8.附件:服務器上的xml解析文件
- <?xml version="1.0" encoding="UTF-8"?>
- <blogs>
- <blog>
- <portrait>http://192.168.1.126/Myweb/b1.jpg</portrait>
- <name>QQ音樂</name>
- <content>問自己一個問題:既然1+22=2+1,那麼是否 I love youyou=you love me?</content>
- <pic>http://192.168.1.126/Myweb/b2.jpg</pic>
- <from>來自 QQ空間說說</from>
- </blog>
- <blog>
- <portrait>http://192.168.1.126/Myweb/portrait2.jpeg</portrait>
- <name>江南小丑</name>
- <content>為什麼總感覺還會再見到你? 既然走了為什麼再回來? </content>
- <from>來自 QQ空間說說</from>
- </blog>
- <blog>
- <portrait>http://192.168.1.126/Myweb/portrait3.jpeg</portrait>
- <name>美食廣場</name>
- <content>好誘人的美食哦,你要不要嘗嘗?</content>
- <pic>http://192.168.1.126/Myweb/content1.jpeg</pic>
- <from>來自 騰訊微博</from>
- </blog>
- <blog>
- <portrait>http://192.168.1.126/Myweb/portrait1.jpeg</portrait>
- <name>蔣坤</name>
- <content>好像雙系統不那麼好Ghost啊!</content>
- <from>來自 QQ空間說說</from>
- </blog>
- <blog>
- <portrait>http://192.168.1.126/Myweb/portrait2.jpeg</portrait>
- <name>蔓珠莎華</name>
- <content>為什麼總感覺還會再見到你? 既然走了為什麼再回來? </content>
- <from>來自 QQ空間說說</from>
- </blog>
- <blog>
- <portrait>http://192.168.1.126/Myweb/portrait3.jpeg</portrait>
- <name>各種誘惑美食</name>
- <content>宮廷桂花糕, 好正點!!</content>
- <pic>http://192.168.1.126/Myweb/content1.jpeg</pic>
- <from>來自 騰訊微博</from>
- </blog>
- </blogs>
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
本文實例講述了Android編程實現ImageView圖片拋物線動畫效果的方法。分享給大家供大家參考,具體如下: 想實現拋物線動畫,必須知道拋物線的方程,這時候數
前面一篇文章實現了使用ViewPager實現高仿launcher拖動效果 ,後來很多朋友問能不能實現左右循環滑動效果和引導頁面。今天實現了左右滑動,至於在最後一頁