加載思路
- BitmapRegionDecoder 根據(jù)要展示的矩形大小及長(zhǎng)圖的流來(lái)生成Bitmap進(jìn)行顯示
- 使用自定義的View,根據(jù)用戶的操作及長(zhǎng)圖的尺寸來(lái)實(shí)時(shí)定位要顯示的矩形大小
- 實(shí)時(shí)更新顯示,這樣完成加載長(zhǎng)圖的功能
重點(diǎn)步驟
從流中截取生成顯示的Bitmap
BitmapRegionDecoder mBitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, false); // false 不共享 圖片源,這樣當(dāng)外部流關(guān)閉時(shí)不影響自身操作
bitmap = mBitmapRegionDecoder.decodeRegion(mRect, mOptions);//根據(jù)區(qū)域生成Bitmap,mOptions為加載優(yōu)化設(shè)置,不影響主體功能
計(jì)算縮放顯示比例
mViewHeight = getMeasuredHeight();
mViewWidth = getMeasuredWidth();
mRect.left = 0;
mRect.top = 0;
mRect.right = mImageWidth;
// 縮放因子
mScale = mViewWidth / (float) mImageWidth;
// x * mscale = mViewHeight
mRect.bottom = (int) (mViewHeight / mScale);
響應(yīng)手勢(shì)(GestureDetector)與滑動(dòng)(Scroller)
@Override
public boolean onTouch(View v, MotionEvent event) {
// 事件交給手勢(shì)處理
return mGestureDetector.onTouchEvent(event);
}
//點(diǎn)擊--ACTION_DOWN
@Override
public boolean onDown(MotionEvent e) {
// 如果滑動(dòng)還沒(méi)有停止 強(qiáng)制停止
if (!mScroller.isFinished()) {
mScroller.forceFinished(true);
}
//繼續(xù)接收后續(xù)事件
return true;
}
//滑動(dòng)--ACTION_DOWN 多個(gè)ACTION_MOVE
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//改變加載圖片的區(qū)域
mRect.offset(0, (int) distanceY);
//滑動(dòng)到底
if (mRect.bottom > mImageHeight) {
mRect.bottom = mImageHeight;
mRect.top = mImageHeight - (int) (mViewHeight / mScale);
}
//滑動(dòng)到頂
if (mRect.top < 0) {
mRect.top = 0;
mRect.bottom = (int) (mViewHeight / mScale);
}
// 重繪
invalidate();
return false;
}
//快滑--ACTION_DOWN 多個(gè)ACTION_MOVE ACTION_UP
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
/**
* startX: 滑動(dòng)開(kāi)始的x坐標(biāo)
* velocityX: 以每秒像素為單位測(cè)量的初始速度
* minX: x方向滾動(dòng)的最小值
* maxX: x方向滾動(dòng)的最大值
*/
mScroller.fling(0, mRect.top, 0, (int) -velocityY, 0, 0,
0, mImageHeight - (int) (mViewHeight / mScale));
return false;
}
@Override
public void computeScroll() {
//已經(jīng)計(jì)算結(jié)束 return
if (mScroller.isFinished()) {
return;
}
//true 表示當(dāng)前動(dòng)畫(huà)未結(jié)束
if (mScroller.computeScrollOffset()) {
mRect.top = mScroller.getCurrY();
mRect.bottom = mRect.top + (int) (mViewHeight / mScale);
invalidate();
}
}
實(shí)現(xiàn)類(lèi)
https://gitee.com/sj_tick/AndroidTools/blob/master/tools/src/main/java/com/sj/tools/customview/BigImageView.java
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。