android實現動態相簿瀏覽圖片

來源:互聯網
上載者:User

 

上一篇文章連結

上一篇文章基本上實現了圖片的拖拉 放大等更能, 有缺點,經過今天的測試發現bug 不少:

 

一是: 在拖動的過程中效果很生硬,沒有上一張下一張的效果 :下面將採用動畫效果實現。

二是:在動態過去圖片的過程瀏覽的過程中下一張瀏覽的資訊依然保留了上一張圖片圖片瀏覽的資訊,比如,我把上一張圖片進行了放大的查看,而在拖動下一張查看的時候出現了上一上瀏覽的時的矩陣狀態,放大的狀態,原因是:沒有進行初始化新圖片資訊。

三是:從伺服器擷取圖片時候,有時候是擷取不到圖片,對擷取不到圖片進行的許可權控制操作。

四是: 程式快速拖動查看圖片的時很容易出現 記憶體溢出的問題  原因:沒有對bitmap進行有效釋放,合理合時的的釋放。

 

因為時間關係:先回家了,伺服器也掛了,又不能給上傳給你們看了,這是我寫的,可能寫的不是很好,忘指教

package com.jh.dongyi.activity;import java.util.ArrayList;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.graphics.PointF;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.DisplayMetrics;import android.util.FloatMath;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.view.animation.AnimationUtils;import android.widget.Button;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.ImageView.ScaleType;import com.jh.dongyi.entity.ProjectImage;import com.jh.dongyi.enumate.CustomerType;import com.jh.dongyi.impl.DBFunction;import com.jh.dongyi.util.BaseActivity;import com.jh.dongyi.util.Configuration;import com.jh.dongyi.util.ImageFactory;import com.jh.dongyi.util.POAException;import com.jh.dongyi.util.TakePhotoListener;/** *  * <code>LocalePicDatailsActivity</code> * @description: TODO(查看原始圖片資訊)  * @version  1.0 * @author  liaoyp * @since 2011-12-14 */public class LocalePicDatailsActivity extends BaseActivity implements OnTouchListener {    private Button bt_back;private Button im_take_photo;private TextView title;private Button bt_save;// 材料科private TextView tv_photo_type;// 工程部-巡檢 熊洋亭//上傳於 2009-8-7 14:54private TextView tv_photo_job;private ProjectImage projectImage;private ProgressBar loadingpb;private String path;private Bitmap bitmap;private ImageView iv_work_photo;private Bundle bundle;// 是否下載圖片private boolean download =true;;// 動畫顯示private boolean isShowNext =true;;// 手勢監聽//private GestureDetector gestureDetector;//映像矩陣Matrix matrix = new Matrix();//Matrix savedMatrix = new Matrix();// 記錄第一個點PointF first = new PointF();PointF start = new PointF();PointF mid = new PointF();private float oldDist;static final int NONE = 0;static final int DRAG = 1;static final int ZOOM = 2;int mode = NONE;private long beginTime,endTime;//禁止拖動擴大boolean forbidZoom =true;// 當前點擊的是哪一張照片的位置private int position;// 所有圖片列表private ArrayList<ProjectImage> projectImageList;// 是否是客戶private boolean isCustomer;// 拍照private TakePhotoListener photoListener;// 資料庫private DBFunction function;// 裝置高 寬int dwidth ,dheight;Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if(msg.what == 10){loadingpb.setVisibility(View.GONE);if(bitmap != null){forbidZoom = true;// 在下載完圖片後初始畫後一張圖片的矩陣資訊,對找不到伺服器上的圖片在本地進行預設圖片替換 同時對其進行許可權控制,使其不能擴大 縮小,拖動
initScaleBitmap(bitmap,true);//iv_work_photo.setImageBitmap(bitmap);}else{forbidZoom = false;//iv_work_photo.setImageResource(R.drawable.file_broken);initScaleBitmap(bitmap,false);showToast("載入錯誤!");}}else{forbidZoom = false;loadingpb.setVisibility(View.GONE);//iv_work_photo.setImageResource(R.drawable.file_broken);initScaleBitmap(bitmap,false);showToast("沒有你要看的圖片");}}};/** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);               setContentView(R.layout.work__photo_details);                title = (TextView) findViewById(R.id.title);//gestureDetector = new GestureDetector(this);bt_back = (Button) findViewById(R.id.back);im_take_photo = (Button) findViewById(R.id.save);im_take_photo.setBackgroundResource(R.drawable.top_tackephoto_selector);//照片iv_work_photo = (ImageView) findViewById(R.id.iv_work_photo);tv_photo_type = (TextView) findViewById(R.id.tv_photo_type);tv_photo_job = (TextView) findViewById(R.id.tv_photo_job);loadingpb = (ProgressBar) findViewById(R.id.loadingpb);bt_save = (Button) findViewById(R.id.save);        // 擷取點擊狀態        Bundle bundle = this.getIntent().getExtras();        if (bundle != null) {        if (bundle.get("position") != null) {position = (Integer) bundle.get("position");}        if (bundle.get("projectimageList") != null) {projectImageList = (ArrayList<ProjectImage>) bundle.get("projectimageList");}                projectImage = projectImageList.get(position);path = projectImage.getOriginalImage();        }        //擷取手機螢幕的寬和高        DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);dwidth = dm.widthPixels;dheight = dm.heightPixels;                init();    }    /**     *      * <code>initScaleBitmap</code>     * @description: TODO(根據圖片縮放圖片)      * @param bitmap     * @since   2012-1-9    liaoyp     */public void initScaleBitmap(Bitmap bitmap,boolean ishave){ //     matrix=new Matrix();      if(ishave){      int widOrg=bitmap.getWidth();       int heightOrg=bitmap.getHeight();              // 寬 高 比列       float scaleWid = (float)dwidth/widOrg;       float scaleHeight = (float)dheight/heightOrg;       float scale;       // 如果寬的 比列大於搞的比列 則用高的比列 否則用寬的              if(scaleWid>scaleHeight)       {       scale = scaleHeight;       }       else       scale = scaleWid;      iv_work_photo.setImageBitmap(bitmap);      matrix.setScale(scale,scale);      iv_work_photo.setScaleType(ScaleType.MATRIX);      iv_work_photo.setImageMatrix(matrix);      }else{            iv_work_photo.setImageMatrix(null);      iv_work_photo.setScaleType(ScaleType.CENTER);      iv_work_photo.setImageResource(R.drawable.file_broken);      }            iv_work_photo.setOnTouchListener(this);           iv_work_photo.setLongClickable(true);         // savedMatrix.set(matrix);}@Overridepublic void init() {bundle = LocalePicDatailsActivity.this.getIntent().getExtras();bt_back.setOnClickListener(new OnClickListener() {public void onClick(View v) {LocalePicDatailsActivity.this.finish();}});if (bundle.getBoolean("FromTAB",false) == false && Configuration.customerType == CustomerType.EMPLOYEE.getValue() ) {//員工不是從TAB進入巡查記錄title.setText(Configuration.employee_customerListName+"的現場照片");System.out.println("xiang xi  form tab  false");isCustomer = true;}else {title.setText(getString(R.string.local_pic));}im_take_photo.setVisibility(View.GONE);photoListener = new TakePhotoListener(LocalePicDatailsActivity.this,true);im_take_photo.setOnClickListener(photoListener);if(projectImage != null){if(projectImage.getDescription() != null){tv_photo_type.setText(projectImage.getDescription());}if(projectImage.getDescription() != null){tv_photo_job.setText(projectImage.getUploadInfo());}}else{showToast("載入錯誤!");}if(path != null){new Thread(){public void run(){try {String path1 = new DBFunction(LocalePicDatailsActivity.this).queryImagePath(path,Configuration.return_customerId);if (path1 != null) {bitmap = BitmapFactory.decodeFile(path1);} else {String p = null;p = ImageFactory.getURLBitmap(path, 2);if (p != null) {bitmap =ImageFactory.getBitmapByParh(p);}}} catch (POAException e) {handler.sendEmptyMessage(-1);}if (bitmap != null) {handler.sendEmptyMessage(10);}}}.start();}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK && data.getExtras() != null) {Intent intent = new Intent(getApplicationContext(),UploadPhotoActivity.class);intent.putExtra("Imagepath", photoListener.getFilePath());startActivity(intent);}}class SaveClickListener implements OnClickListener {public void onClick(View v) {}}class BackClickListener implements OnClickListener {public void onClick(View v) {LocalePicDatailsActivity.this.finish();}}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();tv_photo_type = null;tv_photo_job = null;if (projectImage != null) {projectImage = null;}if (bitmap != null) {bitmap = null;}if (projectImageList != null) {projectImageList.clear();projectImageList = null;}if (iv_work_photo != null) {iv_work_photo.clearAnimation();}}/** *  * <code>initImageMessage</code> * @description: TODO(初始化圖片資訊)  * @since   2012-1-6    liaoyp */public void initImageMessage(){// 如果是客戶 ,變換標題startShowAnimation(isShowNext);loadingpb.setVisibility(View.VISIBLE);iv_work_photo.setImageBitmap(null);function = new DBFunction(LocalePicDatailsActivity.this);// 開始動畫ProjectImage projectImage = projectImageList.get(position);if (projectImage != null) {String name = function.getCustomNameByID(String.valueOf(projectImage.getProjectID()));if(!isCustomer){title.setText(name+"的現場照片");}if(projectImage.getDescription() != null){tv_photo_type.setText(projectImage.getDescription());}if(projectImage.getDescription() != null){tv_photo_job.setText(projectImage.getUploadInfo());}path = projectImage.getOriginalImage();if( path != null){new Thread(){public void run(){try {String path1 = new DBFunction(LocalePicDatailsActivity.this).queryImagePath(path,Configuration.return_customerId);if(path1 != null){System.out.println("havpath"+path1);bitmap =ImageFactory.getBitmapByParh(path1);System.out.println("load finish ==");}else{String p = null;p = ImageFactory.getURLBitmap(path, 2);if(p != null){bitmap =ImageFactory.getBitmapByParh(p);}}download = true;} catch (POAException e) {//e.printStackTrace();handler.sendEmptyMessage(1);download =false;}if(download){handler.sendEmptyMessage(10);}}}.start();}}else{showToast("載入錯誤!");}}/** *  * <code>startShowAnimation</code> * @description: TODO(啟動動畫)  * @param isShowNext2 * @since   2012-1-6    liaoyp */private void startShowAnimation(boolean isShowNext2) {iv_work_photo.clearAnimation();if (isShowNext2) {iv_work_photo.startAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));iv_work_photo.startAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));}else{iv_work_photo.startAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));iv_work_photo.startAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));}}//@Override//public boolean onTouchEvent(MotionEvent event) {//// TODO Auto-generated method stub//return gestureDetector.onTouchEvent(event);//}/*public boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {if (e1.getX() - e2.getX() > 120) {// 向左滑動showNext();return true;} else if (e1.getX() - e2.getX() < -120) {// 向右滑動showPrevious();return true;}return false;}*/// 上一圖片資訊private void showPrevious() {// 動畫標識isShowNext = false;getImageView(position - 1);// 初始化圖片資訊initImageMessage();}// 下一張圖片資訊private void showNext() {// 動畫標識isShowNext = true;getImageView(position + 1);// 初始化圖片資訊initImageMessage();}private void getImageView(int Lposition) {position = Lposition;int bigSize = projectImageList.size()-1;if (Lposition >= bigSize) {showToast("已經是最後一張");position = bigSize;} else if (Lposition < 0) {showToast("已經是第一張");position = 0;}else{// 回收圖片,為什麼在這裡回收,我也不多講了,因為不管是瀏覽上一張還是下一張 都需要幫剛剛瀏覽的bitmap釋放,否則很容易出現ooif(bitmap !=null){bitmap.recycle();}}}public boolean onTouch(View v, MotionEvent event) {switch(event.getAction()& MotionEvent.ACTION_MASK)  {  case MotionEvent.ACTION_DOWN:    beginTime = System.currentTimeMillis();    mode = DRAG;  System.out.println("down");  first.set(event.getX(), event.getY());  start.set(event.getX(), event.getY());  break;  case MotionEvent.ACTION_UP:    endTime = System.currentTimeMillis();  System.out.println("endTime=="+(endTime - beginTime));float x = event.getX(0) - first.x;float y = event.getY(0) - first.y;// 多長的距離float move = FloatMath.sqrt(x * x + y * y);System.out.println(x+" move=="+(move));// 方向 int direction = x > 0 ? 1 : -1;// 計算時間和移動的距離  來判斷你想要的操作if(endTime - beginTime<500&&move>20){//這裡就是做你上一頁下一頁//Toast.makeText(this, "----do something-----", 1000).show();// 下一頁if (direction > 0) {showPrevious();return true;}//上一頁if (direction < 0) {showNext();return true;}}  break;  case MotionEvent.ACTION_MOVE:    System.out.println("move");  if(mode == DRAG)  {  if(forbidZoom){  matrix.postTranslate(event.getX()-start.x, event.getY()-start.y);  }  start.set(event.getX(), event.getY());  }  else  {  float newDist = spacing(event);if (newDist > 10f) {//matrix.set(savedMatrix);float scale = newDist / oldDist;System.out.println("scale=="+scale);if (forbidZoom) {matrix.postScale(scale, scale, mid.x, mid.y);}}oldDist = newDist;  }  break;  case MotionEvent.ACTION_POINTER_DOWN:  oldDist = spacing(event);if (oldDist > 10f) {midPoint(mid, event);mode = ZOOM;}  System.out.println("ACTION_POINTER_DOWN");  break;  case MotionEvent.ACTION_POINTER_UP:  System.out.println("ACTION_POINTER_UP");  break;  }if(forbidZoom){iv_work_photo.setImageMatrix(matrix);}return false;}/** * 計算拖動的距離 * @param event * @return */private float spacing(MotionEvent event) {float x = event.getX(0) - event.getX(1);float y = event.getY(0) - event.getY(1);return FloatMath.sqrt(x * x + y * y);}/** * 計算兩點的之間的中間點 * @param point * @param event */private void midPoint(PointF point, MotionEvent event) {float x = event.getX(0) + event.getX(1);float y = event.getY(0) + event.getY(1);point.set(x / 2, y / 2);}}

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.