android中怎么實現(xiàn)長圖加載效果

本篇文章為大家展示了android中怎么實現(xiàn)長圖加載效果,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

南崗網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,南崗網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為南崗上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的南崗做網(wǎng)站的公司定做!

長圖加載要用到一個關(guān)鍵的類BitmapRegionDecoder,長圖加載會使用到bitmap內(nèi)存復(fù)用, 比如view大小是440*654,圖片的寬高是440*12000,那么這個時候就要獲取圖片的寬和高, 跟view的寬和高進(jìn)行對比,獲取到一個縮小比例,那么會得到寬一個比例,高一個比例,用大的比例作為縮放因子,然后配合手勢滑動滑動長圖

import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapRegionDecoder;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Rect;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.util.Log;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.widget.Scroller; import java.io.IOException;import java.io.InputStream;  public class BigView extends View implements GestureDetector.OnGestureListener, View.OnTouchListener {  private static final String TAG = "BigView";  private Scroller mScroller;  private GestureDetector mGestureDetector;  private BitmapFactory.Options mOptions;  private Rect mRect;  private int mImageWidth;  private int mImageHeight;  private BitmapRegionDecoder mDecoder;  private int mViewWidth;  private int mViewHeight;  private float mScale;  private Bitmap bitmap;   public BigView(Context context) {    this(context, null, 0);  }   public BigView(Context context, @Nullable AttributeSet attrs) {    this(context, attrs, 0);  }   public BigView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    //指定要加載的矩形區(qū)域    mRect = new Rect();    //解碼圖片的配置    mOptions = new BitmapFactory.Options();    //手勢    mGestureDetector = new GestureDetector(context, this);    setOnTouchListener(this);    // 滑動幫助    mScroller = new Scroller(context);  }   /**   * 由使用者輸入一張圖片 輸入流   *   * @param is   */  public void setImage(InputStream is) {    //先讀取原圖片的 寬、高    mOptions.inJustDecodeBounds = true;    BitmapFactory.decodeStream(is, null, mOptions);    mImageWidth = mOptions.outWidth;    mImageHeight = mOptions.outHeight;    //復(fù)用 內(nèi)存復(fù)用    mOptions.inMutable = true;    //設(shè)置像素格式為 rgb565    mOptions.inPreferredConfig = Bitmap.Config.RGB_565;    mOptions.inJustDecodeBounds = false;    //創(chuàng)建區(qū)域解碼器 用于區(qū)域解碼圖片    try {      mDecoder = BitmapRegionDecoder.newInstance(is, false);    } catch (IOException e) {      e.printStackTrace();    }    requestLayout();  }   /**   * 測量 view的大小   *   * @param widthMeasureSpec   * @param heightMeasureSpec   */  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    //獲得測量的view的大小    mViewWidth = getMeasuredWidth();    mViewHeight = getMeasuredHeight();    //如果解碼器是null 表示沒有設(shè)置過要現(xiàn)實的圖片    if (null == mDecoder) {      return;    }    //確定要加載的圖片的區(qū)域    mRect.left = 0;    mRect.top = 0;    mRect.right = mImageWidth;//    Log.e(TAG,"縮放因子="+(mViewWidth*1.0f/mImageWidth*1.0f));//    Log.e(TAG,"縮放因子="+(mViewHeight*1.0f/mImageHeight*1.0f));    //獲得縮放因子    mScale = mViewWidth / (float) mImageWidth;     // 需要加載的高 * 縮放因子 = 視圖view的高    // x * mScale = mViewHeight    mRect.bottom = (int) (mViewHeight / mScale);    Log.e(TAG,"l="+mRect.left);    Log.e(TAG,"t="+mRect.top);    Log.e(TAG,"r="+mRect.right);    Log.e(TAG,"b="+mRect.bottom);  }   /**   * 把圖片畫上去   *   * @param canvas   */  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    // 如果解碼器是null 表示沒有設(shè)置過要現(xiàn)實的圖片    if (null == mDecoder) {      return;    }    //復(fù)用上一張bitmap    Log.e(TAG,"復(fù)用上一張bitmap="+bitmap);    mOptions.inBitmap = bitmap;    //解碼指定區(qū)域    bitmap = mDecoder.decodeRegion(mRect, mOptions);    //使用矩陣 對圖片進(jìn)行 縮放    Matrix matrix = new Matrix();    matrix.setScale(mScale, mScale);    //畫出來     canvas.drawBitmap(bitmap, matrix, null);  }    /**   * 手指按下屏幕的回調(diào)   * @param e   * @return   */  @Override  public boolean onDown(MotionEvent e) {    //如果滑動還沒有停止 強(qiáng)制停止    if (!mScroller.isFinished()){      mScroller.forceFinished(true);    }    //繼續(xù)接收后續(xù)事件    return true;  }   @Override  public void onShowPress(MotionEvent e) {   }   @Override  public boolean onSingleTapUp(MotionEvent e) {    return false;  }    @Override  public void onLongPress(MotionEvent e) {   }   /**   * 手指 不離開屏幕 拖動   * @param e1 手指按下去 的事件 -- 獲取開始的坐標(biāo)   * @param e2 當(dāng)前手勢事件 -- 獲取當(dāng)前的坐標(biāo)   * @param distanceX x軸 方向移動的距離   * @param distanceY y方向移動的距離   * @return   */  @Override  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {    // 手指從下往上 圖片也要往上 distanceY是負(fù)數(shù), top 和 bottom 在減    // 手指從上往下 圖片也要往下 distanceY是正數(shù), top 和 bottom 在加    //改變加載圖片的區(qū)域    mRect.offset(0, (int) distanceY);    //bottom大于圖片高了, 或者 top小于0了    if (mRect.bottom > mImageHeight){      mRect.bottom = mImageHeight;      mRect.top = mImageHeight-(int) (mViewHeight / mScale);    }    if (mRect.top < 0){      mRect.top = 0;      mRect.bottom = (int) (mViewHeight / mScale);    }    //重繪    invalidate();    return false;  }   /**   * 手指離開屏幕 滑動 慣性   * @param e1   * @param e2   * @param velocityX 速度 每秒x方向 移動的像素   * @param velocityY y   * @return   */  @Override  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {    /**     * startX: 滑動開始的x坐標(biāo)     * startY: 滑動開始的y坐標(biāo)     * 兩個速度     * minX: x方向的最小值     * max 最大     * y     */    //計算器    mScroller.fling(0,mRect.top,        0,(int)-velocityY,        0,0,0,        mImageHeight - (int) (mViewHeight / mScale));    return false;  }   //獲取計算結(jié)果并且重繪  @Override  public void computeScroll() {    //已經(jīng)計算結(jié)束 return    if (mScroller.isFinished()){      return;    }    //true 表示當(dāng)前動畫未結(jié)束    if (mScroller.computeScrollOffset()){      //      mRect.top = mScroller.getCurrY();      mRect.bottom = mRect.top+ (int) (mViewHeight / mScale);      invalidate();    }  }   @Override  public boolean onTouch(View v, MotionEvent event) {    //交由手勢處理    return mGestureDetector.onTouchEvent(event);  }}

上述內(nèi)容就是android中怎么實現(xiàn)長圖加載效果,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁名稱:android中怎么實現(xiàn)長圖加載效果
URL網(wǎng)址:http://bm7419.com/article6/psddog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站內(nèi)鏈、軟件開發(fā)、手機(jī)網(wǎng)站建設(shè)云服務(wù)器、網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化