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时不是从第一个开始显示,而是默认显示选中那个。
增加手势功能,实现随手势上下滑动不停翻转,并且有加速度,当不滑动时,图片有个慢慢停下来的动作