• Android实战1——图片浏览器(转)


    源文章:http://blog.csdn.net/bellsong/article/details/7357538

    图片浏览器功能:

    1、可以添加本地图片到该图片浏览器

    2、添加的同时可以给图片命名

    3、点击添加到列表的按钮,图片就会显示在列表界面。

    4、列表界面提供图片编辑功能,包括:点击图片名称可以进行重命名,点击删除操作可以将图片从列表界面移除,点击图片缩略图可以进行该图片全屏显示。

    注:该列表界面需要保存相关信息,确保每次启动该图片浏览器时列表显示的内容与上一次退出时显示的内容一致

    具体实现:

    1、新建项目,编写主界面布局文件  ,图片列表通过一个ListView显示

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3    android:layout_width="fill_parent"
     4    android:layout_height="fill_parent"
     5    android:orientation="vertical" >
     6  
     7    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     8     android:layout_width="fill_parent"
     9     android:layout_height="wrap_content"
    10     android:padding="10dip"
    11     >
    12      <TextView
    13             android:id="@+id/textView1"
    14             android:layout_width="wrap_content"
    15             android:layout_height="wrap_content"
    16             android:layout_alignParentLeft="true"
    17             android:text="名称:" />
    18 
    19 
    20         <EditText
    21             android:id="@+id/editName"
    22             android:layout_width="wrap_content"
    23             android:layout_height="wrap_content"
    24       android:layout_centerInParent="true"
    25             android:layout_toRightOf="@id/textView1"
    26             android:hint="请输入图片名称"
    27 />
    28         
    29         <Button
    30             android:id="@+id/btnPickPic"
    31             android:layout_width="wrap_content"
    32             android:layout_height="wrap_content"
    33             android:layout_alignParentRight="true"
    34             android:text="选择图片" />
    35     
    36       </RelativeLayout>
    37       
    38      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    39     android:layout_width="fill_parent"
    40     android:layout_height="wrap_content"
    41     android:padding="10dip">
    42 
    43 
    44     <TextView
    45         android:id="@+id/label"
    46         android:layout_width="wrap_content"
    47         android:layout_height="wrap_content"
    48         android:layout_alignParentLeft="true"
    49         android:text="预览图"/>
    50 
    51 
    52     <ImageView
    53         android:id="@+id/preView"
    54         android:layout_width="wrap_content"
    55         android:layout_height="wrap_content"
    56         android:layout_centerInParent="true"
    57         android:maxWidth="100px"
    58         android:maxHeight="100px"
    59         android:layout_toRightOf="@id/label"/>
    60 
    61 
    62         <Button
    63             android:id="@+id/btnAdd"
    64             android:layout_width="wrap_content"
    65             android:layout_height="wrap_content"
    66             android:layout_alignParentRight="true"
    67             android:text="加到列表" />
    68   
    69 </RelativeLayout>
    70       
    71    <ListView
    72        android:id="@+id/listview"
    73        android:layout_width="match_parent"
    74        android:layout_height="match_parent"
    75        ></ListView>
    76  
    77 </LinearLayout>

    2、listview.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
    
        <ImageView
            android:id="@+id/img"
            android:layout_width="80dip"
            android:layout_height="80dip"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
            />
    
    
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/img"
            android:layout_toRightOf="@+id/img"
            android:layout_centerVertical="true"
             />
    
    
        <Button
            android:id="@+id/view_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_alignTop="@+id/img"
            android:text="删除" />
    
    
    </RelativeLayout>

    3、实现添加本地图片到该应用,添加按钮事件

     1 private Button btnPicPicker; //选择图片按钮
     2 private Button btnPicAdd;//添加到列表按钮
     3 private Uri mPicUri;//系统返回的图片 Uri
     4 private Cursor mPictureCursor;              //图片的明细
     5 private TextView tvPicName;//列表中图片的名称
     6 
     7 
     8     /** Called when the activity is first created. */
     9     @Override
    10     public void onCreate(Bundle savedInstanceState) {
    11         super.onCreate(savedInstanceState);
    12         setContentView(R.layout.main);
    13         
    14         btnPicPicker = (Button)findViewById(R.id.btnPickPic);
    15         btnPicPicker.setOnClickListener(this);
    16     }
    17 
    18 
    19 
    20     /**
    21      * 监听UI点击事件
    22      */
    23 public void onClick(View v) {
    24 // TODO Auto-generated method stub
    25 int mViewId = v.getId();
    26 switch(mViewId){
    27 case R.id.btnPickPic:
    28 findPicture();
    29 break;
    30 default:break;
    31 }
    32 }
    33 
    34 
    35 
    36 
    37 /**
    38 * 查找系统图片
    39 */
    40 private void findPicture() {
    41 // TODO Auto-generated method stub
    42 Intent intent = new Intent();
    43 intent.setType("image/*");
    44 intent.setAction(Intent.ACTION_GET_CONTENT);
    45 startActivityForResult(intent,Constanse.PICTURE_SEARCHER_FLAG);
    46 }
    47 
    48 }

    4、返回图片后的处理 重写onActivityResult

    先创建一个图片的Bean:

     1 package com.bellsong.pv;
     2 
     3 import android.graphics.Bitmap;
     4 
     5 
     6 public class Picture {
     7 
     8 private int id;
     9 private String picName;
    10 private String picUri;
    11 private Bitmap picBitmap;
    12 
    13 
    14 public Picture(){
    15 
    16 }
    17 public Picture (String picName,String picUri){
    18 this.picName = picName;
    19 this.picUri = picUri;
    20 }
    21 public String getPicName() {
    22 return picName;
    23 }
    24 public void setPicName(String picName) {
    25 this.picName = picName;
    26 }
    27 public String getPicUri() {
    28 return picUri;
    29 }
    30 public void setPicUri(String picUri) {
    31 this.picUri = picUri;
    32 }
    33 public Bitmap getPicBitmap() {
    34 return picBitmap;
    35 }
    36 public void setPicBitmap(Bitmap picBitmap) {
    37 this.picBitmap = picBitmap;
    38 }
    39 public int getId() {
    40 return id;
    41 }
    42 public void setId(int id) {
    43 this.id = id;
    44 }
    45 public void clear(){
    46 picName = null;
    47 picUri = null;
    48 picBitmap = null;
    49 }
    50 
    51 }

    当前PicView16Activity:

      1 package com.bellsong.pv;
      2 
      3 
      4 import java.io.FileNotFoundException;
      5 import java.util.ArrayList;
      6 import java.util.List;
      7 
      8 
      9 //
     10 //import com.bellsong.picview.DBManager;
     11 //import com.bellsong.picview.Picture;
     12 //import com.bellsong.picview.PicView15Activity.MyAdapter;
     13 
     14 
     15 import android.app.Activity;
     16 import android.content.ContentResolver;
     17 import android.content.Intent;
     18 import android.database.Cursor;
     19 import android.graphics.Bitmap;
     20 import android.graphics.BitmapFactory;
     21 import android.net.Uri;
     22 import android.os.Bundle;
     23 import android.util.Log;
     24 import android.view.View;
     25 import android.view.View.OnClickListener;
     26 import android.widget.Button;
     27 import android.widget.ImageView;
     28 import android.widget.ListView;
     29 import android.widget.TextView;
     30 
     31 
     32 public class PicView16Activity extends Activity implements OnClickListener {
     33 
     34 private Button btnPicPicker;//选择图片按钮
     35 private Button btnPicAdd;//添加到列表按钮
     36 private TextView tvPicName;//列表中图片的名称
     37 private ImageView ivPicPre;                 //预览图
     38 
     39 private Uri mPicUri;//系统返回的图片 Uri
     40 private Cursor mPictureCursor;              //图片的明细
     41 
     42 
     43 private Picture mCurrentPicture;            //当前图片
     44 
     45 
     46 
     47 
     48 
     49     /** Called when the activity is first created. */
     50     @Override
     51     public void onCreate(Bundle savedInstanceState) {
     52         super.onCreate(savedInstanceState);
     53         setContentView(R.layout.main);
     54         
     55         //实例化数据
     56         mCurrentPicture = new Picture();
     57         
     58         
     59         btnPicPicker = (Button)findViewById(R.id.btnPickPic);
     60         ivPicPre     = (ImageView)findViewById(R.id.preView);
     61         tvPicName    = (TextView)findViewById(R.id.editName);
     62         
     63         btnPicPicker.setOnClickListener(this);
     64     }
     65 
     66 
     67 
     68 
     69 
     70 
     71     /**
     72      * 监听UI点击事件
     73      */
     74 public void onClick(View v) {
     75 // TODO Auto-generated method stub
     76 int mViewId = v.getId();
     77 switch(mViewId){
     78 case R.id.btnPickPic:
     79 findPicture();
     80 break;
     81 default:break;
     82 }
     83 }
     84 
     85 
     86 
     87 
     88 /**
     89 * 查找系统图片
     90 */
     91 private void findPicture() {
     92 // TODO Auto-generated method stub
     93 Intent intent = new Intent();
     94 intent.setType("image/*");
     95 intent.setAction(Intent.ACTION_GET_CONTENT);
     96 startActivityForResult(intent,Constanse.PICTURE_SEARCHER_FLAG);
     97 }
     98 
     99 
    100 
    101 
    102 
    103 
    104 /**
    105 * 返回图片后的处理 
    106 * 根据uri获得图片的信息,显示在界面上
    107 */
    108 @Override
    109 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    110 // TODO Auto-generated method stub
    111 super.onActivityResult(requestCode, resultCode, data);
    112 
    113 if(requestCode == Constanse.PICTURE_SEARCHER_FLAG){
    114 if(resultCode == RESULT_OK){
    115 //取得图片的Uri
    116 mPicUri = data.getData();
    117 ContentResolver mContenResolver = this.getContentResolver();
    118 //解析Uri里边的信息
    119    mPictureCursor = mContenResolver.query(mPicUri, null, null, null, null);
    120 mPictureCursor.moveToFirst();
    121 
    122 //获取图片明细信息   ---开发时使用
    123 // for(int i = 0; i<mPictureCursor.getColumnCount();i++){
    124 // Log.i("test",i+"-----------------"+mPictureCursor.getString(i));
    125 // }
    126 try {
    127 //清空当前图片
    128 mCurrentPicture.clear();
    129 Bitmap bitmap =BitmapFactory.decodeStream(mContenResolver.openInputStream(mPicUri));
    130 mCurrentPicture.setPicBitmap(bitmap);
    131 String picname = mPictureCursor.getString(5);
    132 mCurrentPicture.setPicName(picname);
    133 mCurrentPicture.setPicUri(mPictureCursor.getString(1));
    134 
    135 //显示在UI中的预览图和图片名字
    136 ivPicPre.setImageBitmap(bitmap);
    137 tvPicName.setText(picname);
    138 } catch (FileNotFoundException e) {
    139 e.printStackTrace();
    140 }finally{
    141 mPictureCursor.close();
    142 }
    143 }
    144 }
    145 }
    146 }

    5、添加数据库

    1)创建数据库,保存图片的名字 uri

     1 DatabaseHelper.java
     2 
     3 package com.bellsong.pv;
     4 
     5 
     6 import android.content.Context;
     7 import android.database.sqlite.SQLiteDatabase;
     8 import android.database.sqlite.SQLiteOpenHelper;
     9 import android.database.sqlite.SQLiteDatabase.CursorFactory;
    10 
    11 
    12 public class DatabaseHelper extends SQLiteOpenHelper{
    13 
    14 
    15 
    16 
    17 public DatabaseHelper(Context context, String name, CursorFactory factory,
    18 int version) {
    19 super(context, name, factory, version);
    20 // TODO Auto-generated constructor stub
    21 }
    22 
    23 
    24 public DatabaseHelper(Context context) {
    25 // TODO Auto-generated constructor stub
    26 super(context, Constanse.DATABASE_NAME, null, Constanse.DATABASE_VERSION);
    27 }
    28 
    29 
    30 @Override
    31 public void onCreate(SQLiteDatabase db) {
    32 // TODO Auto-generated method stub
    33 db.execSQL("CREATE TABLE IF NOT EXISTS pic" +  
    34         "(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, uri VARCHAR)");  
    35 }
    36 
    37 
    38 @Override
    39 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    40 // TODO Auto-generated method stub
    41 db.execSQL("ALTER TABLE pic ADD COLUMN other STRING"); 
    42 }
    43 }

    2)封装一个数据库工具类

      1 package com.bellsong.pv;
      2 
      3 
      4 import java.util.ArrayList;
      5 import java.util.List;
      6 
      7 
      8 import android.content.ContentValues;
      9 import android.content.Context;
     10 import android.database.Cursor;
     11 import android.database.SQLException;
     12 import android.database.sqlite.SQLiteDatabase;
     13 import android.graphics.BitmapFactory;
     14 
     15 
     16 /**
     17  * 数据库工具类
     18  * @author Administrator
     19  *
     20  */
     21 public class DBManager {
     22 private DatabaseHelper helper;
     23 private SQLiteDatabase db;
     24 
     25 /**
     26 * @param context
     27 * 简要说明:因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);  
     28 * 所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里  
     29 */
     30 public DBManager(Context context) {  
     31        helper = new DatabaseHelper(context);  
     32        db = helper.getWritableDatabase();  
     33    }  
     34  
     35 /**
     36  * 添加图片
     37  * 
     38  */
     39 public int addOne(Picture picture){
     40 int tableId = -1;
     41 db.beginTransaction();  //开始事务  
     42 try{
     43 ContentValues cv = new ContentValues();  
     44     cv.put("name", picture.getPicName()); 
     45     cv.put("uri", picture.getPicUri()); 
     46     //返回一个id,用来判断是否插入成功
     47     tableId = (int)db.insert("pic", null, cv);
     48 db.setTransactionSuccessful();  //设置事务成功完成  
     49 }
     50 catch(SQLException e){
     51 }
     52 finally{
     53 db.endTransaction();    //结束事务  
     54 }
     55 return tableId;
     56 }
     57 
     58 
     59    /** 
     60     * 更新图片名称
     61     * @param Picture 
     62     */  
     63    public boolean updateName(Picture picture) {  
     64     db.beginTransaction();  //开启事务
     65     try{
     66     ContentValues cv = new ContentValues();  
     67     cv.put("name", picture.getPicName());  
     68     db.update("pic", cv, "_id = "+picture.getId(), null);  
     69     db.setTransactionSuccessful();  //设置事务成功完成  
     70     }
     71        catch(SQLException e){
     72 return false;
     73 }finally{
     74          db.endTransaction();    //结束事务  
     75        }
     76        return true;
     77    }  
     78      
     79    /** 
     80     * 删除图片
     81     * @param Picture 
     82     */  
     83    public boolean deleteOldPicture(Picture picture) {  
     84        
     85 db.beginTransaction();  //开始事务  
     86 try{
     87 db.delete("pic", "_id = " + picture.getId(), null);  
     88 db.setTransactionSuccessful();  //设置事务成功完成  
     89 }
     90 catch(SQLException e){
     91 return false;
     92 }
     93 finally{
     94   
     95 db.endTransaction();    //结束事务  
     96 }
     97 return true;
     98        
     99    }  
    100      
    101    /** 
    102     * 查询图片
    103     * @return List<Picture> 
    104     */  
    105    public List<Picture> query() {  
    106        ArrayList<Picture> pictures = new ArrayList<Picture>();  
    107        Cursor c = queryTheCursor();  
    108        while (c.moveToNext()) {  
    109            Picture picture = new Picture();  
    110            picture.setPicName(c.getString(c.getColumnIndex("name")));  
    111            picture.setPicUri(c.getString(c.getColumnIndex("uri")));
    112            picture.setPicBitmap(BitmapFactory.decodeFile(picture.getPicUri()));
    113            picture.setId(c.getInt(c.getColumnIndex("_id")));
    114            pictures.add(picture);  
    115        }  
    116        c.close();  
    117        return pictures;  
    118    }  
    119    
    120    /**
    121     * 判断是否已经存在该图片
    122     * @param picture
    123     * @return
    124     */
    125    public boolean queryIfExist(Picture picture){
    126     Cursor cr = db.query("pic", null, "name = ?", new String[]{picture.getPicName()}, null, null, null);
    127     if(cr.getCount()!=0){
    128     return true;
    129     }else{
    130     return false;
    131     }
    132    }
    133    /** 
    134     * 查询图片
    135     * @return  Cursor 
    136     */  
    137    public Cursor queryTheCursor() {  
    138        Cursor c = db.rawQuery("SELECT * FROM pic", null);  
    139        return c;  
    140    }  
    141    /** 
    142     * 关闭数据库 
    143     */  
    144    public void closeDB() {  
    145        db.close();  
    146    }  
    147 }

    6、实现名字更改,动态增加删除,点击图片预览等功能

    详细代码:

      1 PicView16Activity.java
      2 
      3 package com.bellsong.pv;
      4 
      5 
      6 import java.io.FileNotFoundException;
      7 import java.util.ArrayList;
      8 import java.util.List;
      9 
     10 
     11 import android.app.Activity;
     12 import android.app.AlertDialog;
     13 import android.content.ContentResolver;
     14 import android.content.Context;
     15 import android.content.DialogInterface;
     16 import android.content.Intent;
     17 import android.database.Cursor;
     18 import android.graphics.Bitmap;
     19 import android.graphics.BitmapFactory;
     20 import android.net.Uri;
     21 import android.os.AsyncTask;
     22 import android.os.Bundle;
     23 import android.util.Log;
     24 import android.view.LayoutInflater;
     25 import android.view.View;
     26 import android.view.View.OnClickListener;
     27 import android.view.ViewGroup;
     28 import android.widget.BaseAdapter;
     29 import android.widget.Button;
     30 import android.widget.EditText;
     31 import android.widget.ImageView;
     32 import android.widget.ListView;
     33 import android.widget.TextView;
     34 import android.widget.Toast;
     35 
     36 
     37 public class PicView16Activity extends Activity implements OnClickListener {
     38 
     39 private Button btnPicPicker;//选择图片按钮
     40 private Button btnPicAdd;//添加到列表按钮
     41 private Button btnPicDel;//删除图片按钮
     42 private TextView tvPicName;//列表中图片的名称
     43 private ImageView ivPicPre;                 //预览图
     44 
     45 private ListView listview;//图片列表
     46 private View reNameView;//重命名视图
     47 
     48 private ImageView  img;
     49 private TextView   title;
     50 
     51 private Uri mPicUri;//系统返回的图片 Uri
     52 private Cursor mPictureCursor;              //图片的明细
     53 private DBManager mPicDatabase;//数据库操作类
     54 
     55 
     56 private Picture mCurrentPicture;            //当前图片
     57 private List<Picture> mData;//Adapter的数据源
     58 private MyAdapter adapter;
     59 
     60 private ArrayList<String> mPictureUris;//图片路径集
     61 
     62 
     63     /** Called when the activity is first created. */
     64     @Override
     65     public void onCreate(Bundle savedInstanceState) {
     66         super.onCreate(savedInstanceState);
     67         setContentView(R.layout.main);
     68         
     69         //实例化数据
     70         mCurrentPicture = new Picture();
     71         mPicDatabase    = new DBManager(this);
     72         mData           = new ArrayList<Picture>();
     73         mPictureUris    = new ArrayList<String>();
     74         
     75         listview = (ListView)findViewById(R.id.listview);
     76         adapter  = new MyAdapter(this);
     77         listview.setAdapter(adapter);
     78         
     79         //异步Task查询数据库
     80         new LoadData().execute();
     81         
     82         
     83         btnPicPicker = (Button)findViewById(R.id.btnPickPic);
     84         btnPicAdd    = (Button)findViewById(R.id.btnAdd);
     85         
     86         ivPicPre     = (ImageView)findViewById(R.id.preView);
     87         tvPicName    = (TextView)findViewById(R.id.editName);
     88         
     89         
     90         btnPicPicker.setOnClickListener(this);
     91         btnPicAdd.setOnClickListener(this);
     92    
     93         
     94         
     95     }
     96 
     97 
     98 
     99 
    100 
    101 
    102     /**
    103      * 监听UI点击事件
    104      */
    105 public void onClick(View v) {
    106 // TODO Auto-generated method stub
    107 int mViewId = v.getId();
    108 switch(mViewId){
    109 case R.id.btnPickPic:
    110 findPicture();
    111 break;
    112 case R.id.btnAdd:
    113 addPicture();
    114 break;
    115 default:break;
    116 }
    117 }
    118 
    119 
    120 /**
    121 * 添加图片到本地数据库
    122 */
    123 private void addPicture() {
    124 // TODO Auto-generated method stub
    125 //判断图片名字和图片路径是否为空
    126   if(!(tvPicName.getText().toString().equals("")) && mCurrentPicture.getPicUri() != null && mCurrentPicture.getPicUri().length() > 0){
    127     //取得当前EditText中的图片名字
    128     mCurrentPicture.setPicName(tvPicName.getText().toString());
    129       //判断是否重命名  方法:根据名字 先查询数据库
    130       if(!mPicDatabase.queryIfExist(mCurrentPicture)){
    131         int mTableId = mPicDatabase.addOne(mCurrentPicture);
    132          if(mTableId != -1 ){
    133              Picture mPicture = new Picture();
    134              mPicture.setId(mCurrentPicture.getId());
    135              mPicture.setPicName(mCurrentPicture.getPicName());
    136              mPicture.setPicBitmap(mCurrentPicture.getPicBitmap());
    137              mPicture.setPicUri(mCurrentPicture.getPicUri());
    138              mData.add(mPicture);
    139              adapter.notifyDataSetChanged();
    140            }else{
    141               System.out.println("插入失败");
    142            }
    143         }else{
    144            Toast.makeText(PicView16Activity.this, "该名字已存在,请重命名", Toast.LENGTH_LONG).show();
    145         }
    146   }
    147   else{
    148      Toast.makeText(PicView16Activity.this, "请选择图片", Toast.LENGTH_LONG).show();
    149 
    150   }
    151 }
    152 
    153 
    154 /**
    155 * 查找系统图片
    156 */
    157 private void findPicture() {
    158 // TODO Auto-generated method stub
    159 Intent intent = new Intent();
    160 intent.setType("image/*");
    161 intent.setAction(Intent.ACTION_GET_CONTENT);
    162 startActivityForResult(intent,Constanse.PICTURE_SEARCHER_FLAG);
    163 }
    164 
    165 
    166 public void showPicture() {
    167 // TODO Auto-generated method stub
    168 
    169 }
    170 
    171 
    172 
    173 /**
    174 * 返回图片后的处理 
    175 * 根据uri获得图片的信息,显示在界面上
    176 */
    177 @Override
    178 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    179 // TODO Auto-generated method stub
    180 super.onActivityResult(requestCode, resultCode, data);
    181 
    182 if(requestCode == Constanse.PICTURE_SEARCHER_FLAG){
    183 if(resultCode == RESULT_OK){
    184 //取得图片的Uri
    185 mPicUri = data.getData();
    186 ContentResolver mContenResolver = this.getContentResolver();
    187 //解析Uri里边的信息
    188    mPictureCursor = mContenResolver.query(mPicUri, null, null, null, null);
    189 mPictureCursor.moveToFirst();
    190 
    191 //获取图片明细信息   ---开发时使用
    192 // for(int i = 0; i<mPictureCursor.getColumnCount();i++){
    193 // Log.i("test",i+"-----------------"+mPictureCursor.getString(i));
    194 // }
    195 
    196 try {
    197 //清空当前图片
    198 mCurrentPicture.clear();
    199 Bitmap bitmap =BitmapFactory.decodeStream(mContenResolver.openInputStream(mPicUri));
    200 mCurrentPicture.setPicBitmap(bitmap);
    201 String picname = mPictureCursor.getString(5);
    202 mCurrentPicture.setPicName(picname);
    203 mCurrentPicture.setPicUri(mPictureCursor.getString(1));
    204 
    205 //显示在UI中的预览图和图片名字
    206 ivPicPre.setImageBitmap(bitmap);
    207 tvPicName.setText(picname);
    208 } catch (FileNotFoundException e) {
    209 e.printStackTrace();
    210 }finally{
    211 mPictureCursor.close();
    212 }
    213 }
    214 }
    215 }
    216 
    217 
    218 private class MyAdapter extends BaseAdapter{
    219 
    220 private Context context;
    221 private LayoutInflater mInflater;
    222  
    223 public MyAdapter(Context context){
    224        this.mInflater = LayoutInflater.from(context);
    225        this.context = context;
    226    }
    227 
    228 
    229 public int getCount() {
    230 // TODO Auto-generated method stub
    231 return mData.size();
    232 }
    233 
    234 
    235 public Picture getItem(int position) {
    236 // TODO Auto-generated method stub
    237 return mData.get(position);
    238 }
    239 
    240 
    241 public long getItemId(int position) {
    242 // TODO Auto-generated method stub
    243 return 0;
    244 }
    245 
    246 
    247 public View getView(int position, View convertView, ViewGroup parent) {
    248 // TODO Auto-generated method stub
    249 final int selectId = position;
    250 if(convertView == null){
    251 convertView=mInflater.inflate(R.layout.listview, null);
    252 }
    253 //获得控件对象
    254 img = (ImageView)convertView.findViewById(R.id.img);
    255 img.setAdjustViewBounds(true);
    256 title = (TextView)convertView.findViewById(R.id.title);
    257 btnPicDel = (Button)convertView.findViewById(R.id.btnDel);
    258 final Picture mPictureView = mData.get(position);
    259 
    260 
    261 img.setImageBitmap(mPictureView.getPicBitmap());
    262 title.setText(mPictureView.getPicName());
    263 
    264 final int mPosition = position;
    265 final Picture tempPicture = mPictureView;
    266 
    267 //删除图片按钮操作
    268 btnPicDel.setOnClickListener(new OnClickListener() {
    269 
    270 public void onClick(View v) {
    271 // TODO Auto-generated method stub
    272 delPictureInfo(tempPicture,selectId);
    273 }
    274 });
    275 
    276 //重命名按钮操作
    277 title.setOnClickListener(new OnClickListener() {
    278 
    279 public void onClick(View v) {
    280 Log.i("bell", tempPicture.getId()+"");
    281 reNamePicture(tempPicture,mPosition);
    282 }
    283 });
    284 
    285 //预览图片按钮操作
    286 img.setOnClickListener(new OnClickListener() {
    287 
    288 public void onClick(View v) {
    289 // TODO Auto-generated method stub
    290 Intent intent = new Intent();
    291 intent.setClass(PicView16Activity.this, PictureView.class);
    292 for(Picture pic : mData){
    293 mPictureUris.add(pic.getPicUri());
    294 Log.i("bell", pic.getPicUri());
    295 }
    296 Log.i("bell", ""+mPictureUris.size());
    297 
    298 Bundle bunde = new Bundle();
    299 bunde.putStringArrayList("picUris", mPictureUris);
    300 bunde.putInt("position", mPosition);
    301 intent.putExtras(bunde);
    302 startActivity(intent);
    303 // PicView16Activity.this.finish();
    304 
    305 }
    306 });
    307 
    308 return convertView;
    309 }
    310 
    311 
    312 
    313 
    314 
    315 /**
    316 * 删除图片操作
    317 */
    318 public boolean delPictureInfo(final Picture mDelPicture,final int mPosition) {
    319 // TODO Auto-generated method stub
    320 // final Picture mDelPicture = mData.get(position);
    321 new AlertDialog.Builder(PicView16Activity.this)
    322 .setTitle("通知")
    323 .setMessage("是否删除?")
    324 .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    325 
    326 public void onClick(DialogInterface dialog, int which) {
    327 // TODO Auto-generated method stub
    328 Log.i("bell", mDelPicture.getId()+"");
    329 if(mPicDatabase.deleteOldPicture(mDelPicture)){
    330 Log.i("bell", "删除成功");
    331 mData.remove(mPosition);
    332 adapter.notifyDataSetChanged();
    333 }
    334 }
    335 }).show();
    336 return true;
    337 }
    338 
    339 /**
    340 * 重命名图片
    341 */
    342 public void reNamePicture(final Picture picture,final int mPosition) {
    343 // TODO Auto-generated method stub
    344 //引用重命名视图的布局文件
    345 LayoutInflater inflater = (LayoutInflater)PicView16Activity.this.getSystemService(LAYOUT_INFLATER_SERVICE);
    346 reNameView = inflater.inflate(R.layout.rename, null);
    347 
    348 final EditText oldName = (EditText)reNameView.findViewById(R.id.rename);
    349 oldName.setText(picture.getPicName());
    350 
    351 new AlertDialog.Builder(PicView16Activity.this)
    352 .setTitle("重命名")
    353 .setView(reNameView)
    354 .setPositiveButton("确认",new DialogInterface.OnClickListener() {
    355 
    356 public void onClick(DialogInterface dialog, int which) {
    357 // TODO Auto-generated method stub
    358 String rename =oldName.getText().toString().trim();//空指针异常
    359              Picture reNamePic = new Picture();
    360              reNamePic.setPicName(rename);
    361              reNamePic.setId(picture.getId());
    362              if(mPicDatabase.updateName(reNamePic)){
    363              mData.get(mPosition).setPicName(rename);
    364              adapter.notifyDataSetChanged();
    365              }else{
    366              Toast.makeText(PicView16Activity.this, "重命名不成功!", Toast.LENGTH_LONG).show();
    367              }
    368 }
    369 }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
    370 
    371 public void onClick(DialogInterface dialog, int which) {
    372 // TODO Auto-generated method stub
    373 
    374 }
    375 }).show();
    376 }
    377 }
    378 
    379 
    380 /**
    381 * 异步加载数据类
    382 * @author Administrator
    383 *
    384 */
    385 class LoadData extends AsyncTask<Object, String, List<Picture>>{
    386 
    387 @Override
    388 protected List<Picture> doInBackground(Object... params) {
    389 List<Picture> temp =mPicDatabase.query();
    390 return temp;
    391 }
    392 
    393 protected void onPostExecute(final List<Picture> pictureList) {
    394 mData.clear();
    395 mData = pictureList;
    396 adapter.notifyDataSetChanged();
    397 }
    398 }
    399 
    400 @Override
    401 protected void onDestroy() {
    402 // TODO Auto-generated method stub
    403 super.onDestroy();
    404 if(mData != null){
    405 mData.clear();
    406 }
    407 if(mPictureUris != null){
    408 mPictureUris.clear();
    409 }
    410 if(listview != null){
    411 listview.setAdapter(null);
    412 }
    413 mPicDatabase.closeDB();
    414 }
    415 
    416 
    417 }

    7、图片预览,使用gallery,实现了动态上下翻转效果

      1 package com.bellsong.pv;
      2 
      3 
      4 import java.util.List;
      5 
      6 
      7 import android.app.Activity;
      8 import android.content.Context;
      9 import android.graphics.Bitmap;
     10 import android.graphics.BitmapFactory;
     11 import android.os.Bundle;
     12 import android.util.Log;
     13 import android.view.View;
     14 import android.view.ViewGroup;
     15 import android.view.animation.AccelerateInterpolator;
     16 import android.view.animation.Animation;
     17 import android.view.animation.DecelerateInterpolator;
     18 import android.widget.AdapterView;
     19 import android.widget.AdapterView.OnItemClickListener;
     20 import android.widget.BaseAdapter;
     21 import android.widget.Gallery;
     22 import android.widget.ImageView;
     23 
     24 
     25 public class PictureView extends Activity{
     26 
     27 private Context mContext;
     28 private List<String> mPictureUris;
     29 private Bitmap mBitmap;
     30 private Gallery mGallery;
     31 private ImageView mImageView;
     32 private int mPosition;
     33 
     34 @Override
     35 protected void onCreate(Bundle savedInstanceState) {
     36 // TODO Auto-generated method stub
     37 super.onCreate(savedInstanceState);
     38 setContentView(R.layout.gallery);
     39 
     40 Bundle bunde = getIntent().getExtras();
     41 mPictureUris = bunde.getStringArrayList("picUris");
     42 mPosition    = bunde.getInt("position");
     43 for(String uri : mPictureUris){
     44 Log.i("note",uri+"  selectedId:"+mPosition + "  size: "+mPictureUris.size());
     45 }
     46 
     47 mGallery = (Gallery)findViewById(R.id.gallery);
     48 mGallery.setAdapter(new ImageAdapter(this));
     49 
     50 mGallery.setPersistentDrawingCache(ViewGroup.PERSISTENT_ANIMATION_CACHE);
     51 
     52 mGallery.setOnItemClickListener(new OnItemClickListener() {
     53 
     54 
     55 public void onItemClick(AdapterView<?> parent, View view,
     56 int position, long id) {
     57 // TODO Auto-generated method stub
     58 // Animation myanim =AnimationUtils.loadAnimation(mContext, R.anim.myanim);
     59 //             view.startAnimation(myanim);
     60 
     61 applyRotation(position, 0, 360);
     62 
     63 }
     64 });
     65 
     66 }
     67 
     68 /**
     69      * Setup a new 3D rotation on the container view.
     70      *
     71      * @param position the item that was clicked to show a picture, or -1 to show the list
     72      * @param start the start angle at which the rotation must begin
     73      * @param end the end angle of the rotation
     74      */
     75     private void applyRotation(int position, float start, float end) {
     76         // Find the center of the container
     77         final float centerX = mImageView.getWidth() / 2.0f;
     78         final float centerY = mImageView.getHeight() / 2.0f;
     79 
     80 
     81         // Create a new 3D rotation with the supplied parameter
     82         // The animation listener is used to trigger the next animation
     83         final Rotate3dAnimation rotation =
     84                 new Rotate3dAnimation(start, end, centerX, centerY, 0, false);
     85         rotation.setDuration(2000);//动画时间
     86         rotation.setFillAfter(true);//是否保存动画后的改变
     87         rotation.setInterpolator(new AccelerateInterpolator());//加速器
     88 //        rotation.setAnimationListener(new DisplayNextView(position));
     89 
     90 
     91         mImageView.startAnimation(rotation);
     92     }
     93 
     94 
     95     /**
     96      * This class listens for the end of the first half of the animation.
     97      * It then posts a new action that effectively swaps the views when the container
     98      * is rotated 90 degrees and thus invisible.
     99      */
    100     private final class DisplayNextView implements Animation.AnimationListener {
    101         private final int mPosition;
    102 
    103 
    104         private DisplayNextView(int position) {
    105             mPosition = position;
    106         }
    107 
    108 
    109         public void onAnimationStart(Animation animation) {
    110         }
    111 
    112 
    113         public void onAnimationEnd(Animation animation) {
    114 //         mImageView.post(new SwapViews(mPosition));
    115         }
    116 
    117 
    118         public void onAnimationRepeat(Animation animation) {
    119         }
    120     }
    121     
    122     
    123     /**
    124      * This class is responsible for swapping the views and start the second
    125      * half of the animation.
    126      */
    127     private final class SwapViews implements Runnable {
    128         private final int mPosition;
    129         public SwapViews(int position) {
    130             mPosition = position;
    131         }
    132 
    133 
    134         public void run() {
    135             final float centerX = mImageView.getWidth() / 1.0f;
    136             final float centerY = mImageView.getHeight() / 2.0f;
    137 //         final float centerX = mImageView.getWidth();
    138 //         final float centerY = mImageView.getHeight();
    139             Rotate3dAnimation rotation;
    140 //            
    141 //            if (mPosition > -1) {
    142 //                mImageView.setVisibility(View.VISIBLE);
    143 //                mImageView.requestFocus();
    144 
    145 
    146                 rotation = new Rotate3dAnimation(0, 360, centerX, centerY,  0, false);
    147 //            } else {
    148 //                mImageView.setVisibility(View.GONE);
    149 
    150 
    151 //                rotation = new Rotate3dAnimation(90, 0, centerX, centerY, 310.0f, false);
    152 //            }
    153 
    154 
    155             rotation.setDuration(2000);
    156             rotation.setFillAfter(true);
    157             rotation.setInterpolator(new DecelerateInterpolator());
    158             mImageView.startAnimation(rotation);
    159         }
    160     }
    161 
    162 
    163 public class ImageAdapter extends BaseAdapter{
    164 private Context mContext;
    165 
    166 public ImageAdapter(Context context){
    167 mContext = context;
    168 
    169 }
    170 
    171 
    172 public int getCount() {
    173 // TODO Auto-generated method stub
    174 return mPictureUris.size();
    175 }
    176 
    177 
    178 public Object getItem(int position) {
    179 // TODO Auto-generated method stub
    180 return null;
    181 }
    182 
    183 
    184 public long getItemId(int position) {
    185 // TODO Auto-generated method stub
    186 return 0;
    187 }
    188 
    189 
    190 public View getView(int position, View convertView, ViewGroup parent) {
    191 // TODO Auto-generated method stub
    192 mImageView  = new ImageView(mContext);
    193 // mImageView.setImageBitmap(BitmapFactory.decodeFile(mPictureUris.get(mPosition)));
    194 mBitmap = BitmapFactory.decodeFile(mPictureUris.get(position));
    195 
    196 
    197 mImageView.setImageBitmap(mBitmap);
    198 mImageView.setScaleType(ImageView.ScaleType.CENTER);
    199 mImageView.setLayoutParams(new Gallery.LayoutParams(400,500));
    200 return mImageView;
    201 }
    202 
    203 }
    204 
    205 
    206 @Override
    207 protected void onDestroy() {
    208 // TODO Auto-generated method stub
    209 super.onDestroy();
    210 if(mPictureUris != null){
    211 mPictureUris.clear();
    212 }
    213 }
    214 
    215 
    216 }
    217 
    218 动画类,直接从ApiDemo中 copy Rotate3dAnimation.java
    219 
    220 /*
    221  * Copyright (C) 2007 The Android Open Source Project
    222  *
    223  * Licensed under the Apache License, Version 2.0 (the "License");
    224  * you may not use this file except in compliance with the License.
    225  * You may obtain a copy of the License at
    226  *
    227  *      http://www.apache.org/licenses/LICENSE-2.0
    228  *
    229  * Unless required by applicable law or agreed to in writing, software
    230  * distributed under the License is distributed on an "AS IS" BASIS,
    231  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    232  * See the License for the specific language governing permissions and
    233  * limitations under the License.
    234  */
    235 
    236 
    237 package com.bellsong.pv;
    238 
    239 
    240 import android.view.animation.Animation;
    241 import android.view.animation.Transformation;
    242 import android.graphics.Camera;
    243 import android.graphics.Matrix;
    244 
    245 
    246 /**
    247  * An animation that rotates the view on the Y axis between two specified angles.
    248  * This animation also adds a translation on the Z axis (depth) to improve the effect.
    249  */
    250 public class Rotate3dAnimation extends Animation {
    251     private final float mFromDegrees;
    252     private final float mToDegrees;
    253     private final float mCenterX;
    254     private final float mCenterY;
    255     private final float mDepthZ;
    256     private final boolean mReverse;
    257     private Camera mCamera;
    258 
    259 
    260     /**
    261      * Creates a new 3D rotation on the X axis. The rotation is defined by its
    262      * start angle and its end angle. Both angles are in degrees. The rotation
    263      * is performed around a center point on the 2D space, definied by a pair
    264      * of X and Y coordinates, called centerX and centerY. When the animation
    265      * starts, a translation on the Z axis (depth) is performed. The length
    266      * of the translation can be specified, as well as whether the translation
    267      * should be reversed in time.
    268      *
    269      * @param fromDegrees the start angle of the 3D rotation
    270      * @param toDegrees the end angle of the 3D rotation
    271      * @param centerX the X center of the 3D rotation
    272      * @param centerY the Y center of the 3D rotation
    273      * @param reverse true if the translation should be reversed, false otherwise
    274      */
    275     public Rotate3dAnimation(float fromDegrees, float toDegrees,
    276             float centerX, float centerY, float depthZ, boolean reverse) {
    277         mFromDegrees = fromDegrees;
    278         mToDegrees = toDegrees;
    279         mCenterX = centerX;
    280         mCenterY = centerY;
    281         mDepthZ = depthZ;
    282         mReverse = reverse;
    283     }
    284 
    285 
    286     @Override
    287     public void initialize(int width, int height, int parentWidth, int parentHeight) {
    288         super.initialize(width, height, parentWidth, parentHeight);
    289         mCamera = new Camera();
    290     }
    291 
    292 
    293     @Override
    294     protected void applyTransformation(float interpolatedTime, Transformation t) {
    295         final float fromDegrees = mFromDegrees;
    296         float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);
    297 
    298 
    299         final float centerX = mCenterX;
    300         final float centerY = mCenterY;
    301         final Camera camera = mCamera;
    302 
    303 
    304         final Matrix matrix = t.getMatrix();
    305 
    306 
    307         camera.save();
    308         if (mReverse) {
    309             camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
    310         } else {
    311             camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
    312         }
    313         camera.rotateX(degrees);//以X轴
    314         camera.getMatrix(matrix);
    315         camera.restore();
    316 
    317 
    318         matrix.preTranslate(-centerX, -centerY);
    319         matrix.postTranslate(centerX, centerY);
    320     }
    321 }
    322 
    323 
    324 gallery.xml
    325 
    326 <Gallery xmlns:android="http://schemas.android.com/apk/res/android" 
    327     android:id="@+id/gallery"
    328 android:layout_width="fill_parent"
    329 android:layout_height="fill_parent"
    330 android:gravity="center_vertical"
    331 android:spacing="150dp"
    332 android:unselectedAlpha="1.2"
    333 />
    334 rename.xml
    335 
    336 <?xml version="1.0" encoding="utf-8"?>
    337 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    338     android:layout_width="match_parent"
    339     android:layout_height="match_parent"
    340     android:orientation="vertical" 
    341     >
    342 
    343 
    344     <TextView 
    345         android:layout_width="match_parent"
    346         android:layout_height="match_parent"
    347         android:text="图片名称:"
    348         />
    349     <EditText 
    350         android:id="@+id/rename"
    351         android:layout_width="fill_parent"
    352         android:layout_height="wrap_content"
    353             />
    354 
    355 
    356 </LinearLayout>
    357 
    358 main.xml
    359 
    360 
    361 <?xml version="1.0" encoding="utf-8"?>
    362 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    363    android:layout_width="fill_parent"
    364    android:layout_height="fill_parent"
    365    android:orientation="vertical" >
    366  
    367    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    368     android:layout_width="fill_parent"
    369     android:layout_height="wrap_content"
    370     android:padding="10dip"
    371     >
    372      <TextView
    373             android:id="@+id/textView1"
    374             android:layout_width="wrap_content"
    375             android:layout_height="wrap_content"
    376             android:layout_alignParentLeft="true"
    377             android:text="名称:" />
    378 
    379 
    380         <EditText
    381             android:id="@+id/editName"
    382             android:layout_width="wrap_content"
    383             android:layout_height="wrap_content"
    384       android:layout_centerInParent="true"
    385             android:layout_toRightOf="@id/textView1"
    386             android:hint="请输入图片名称"
    387 />
    388         
    389         <Button
    390             android:id="@+id/btnPickPic"
    391             android:layout_width="wrap_content"
    392             android:layout_height="wrap_content"
    393             android:layout_alignParentRight="true"
    394             android:text="选择图片" />
    395     
    396       </RelativeLayout>
    397       
    398      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    399     android:layout_width="fill_parent"
    400     android:layout_height="wrap_content"
    401     android:padding="10dip">
    402 
    403 
    404     <TextView
    405         android:id="@+id/label"
    406         android:layout_width="wrap_content"
    407         android:layout_height="wrap_content"
    408         android:layout_alignParentLeft="true"
    409         android:text="预览图"/>
    410 
    411 
    412     <ImageView
    413         android:id="@+id/preView"
    414         android:layout_width="100px"
    415         android:layout_height="100px"
    416         android:layout_centerInParent="true"
    417         android:maxWidth="100px"
    418         android:maxHeight="100px"
    419         android:layout_toRightOf="@id/label"/>
    420 
    421 
    422         <Button
    423             android:id="@+id/btnAdd"
    424             android:layout_width="wrap_content"
    425             android:layout_height="wrap_content"
    426             android:layout_alignParentRight="true"
    427             android:text="加到列表" />
    428   
    429 </RelativeLayout>
    430       
    431    <ListView
    432        android:id="@+id/listview"
    433        android:layout_width="match_parent"
    434        android:layout_height="match_parent"
    435        ></ListView>
    436  
    437 </LinearLayout>
    438 
    439 listview.xml
    440 
    441 <?xml version="1.0" encoding="utf-8"?>
    442 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    443     android:layout_width="match_parent"
    444     android:layout_height="match_parent" >
    445 
    446 
    447     <ImageView
    448         android:id="@+id/img"
    449         android:layout_width="80dip"
    450         android:layout_height="80dip"
    451         android:layout_alignParentLeft="true"
    452         android:layout_alignParentTop="true"
    453         android:layout_marginLeft="10dp"
    454         android:layout_marginTop="10dp"
    455         />
    456 
    457 
    458     <TextView
    459         android:id="@+id/title"
    460         android:layout_width="wrap_content"
    461         android:layout_height="wrap_content"
    462         android:layout_alignBottom="@+id/img"
    463         android:layout_toRightOf="@+id/img"
    464         android:layout_centerVertical="true"
    465         android:layout_marginLeft="20dp"
    466          />
    467 
    468 
    469     <Button
    470         android:id="@+id/btnDel"
    471         android:layout_width="wrap_content"
    472         android:layout_height="wrap_content"
    473         android:layout_alignParentRight="true"
    474         android:layout_centerVertical="true"
    475         android:layout_alignTop="@+id/img"
    476         android:layout_marginTop="25dp"
    477         android:text="删除" />
    478 
    479 
    480 </RelativeLayout>

    8、未解决问题

    如何实现点击图片跳到gallery时不是从第一个开始显示,而是默认显示选中那个。

    增加手势功能,实现随手势上下滑动不停翻转,并且有加速度,当不滑动时,图片有个慢慢停下来的动作

     

     

     

     

     

  • 相关阅读:
    apache
    zabbix 问题
    node起步
    记录一次利用cropperjs修建图片并上传的过程
    vue走过的那些坑
    关于vue传参问题
    mybatis的走过的坑
    通常如何对网站的文件和资源进行优化?
    一个页面从输入URL到页面加载显示完成,这个过程都发生什么?
    JQuery---过滤器
  • 原文地址:https://www.cnblogs.com/raker/p/2737958.html
Copyright © 2020-2023  润新知