Android仿微博加載長圖滾動(dòng)查看效果
本文實(shí)例為大家分享了Android加載長圖片的具體代碼,供大家參考,具體內(nèi)容如下
解決步驟
1.將圖片縮放到與控件等寬
2.判斷縮放后的圖片高度,如果高度大于控件高度較多(這里設(shè)置的是1.5倍),認(rèn)定為長圖,可滑動(dòng)查看圖片
|-如果高度小于控件高度的1.5倍,以控件高度為基準(zhǔn),重新縮放圖片
package org.wandcf_ces.fairproject.widgets; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.os.Build; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * Created by sunrui on 2017/3/8. * 加載長圖片 * 解決步驟 * 1.將圖片縮放到與控件等寬 * 2.判斷縮放后的圖片高度,如果高度大于控件高度較多(這里設(shè)置的是1.5倍),認(rèn)定為長圖,可滑動(dòng)查看圖片 * |-如果高度小于控件高度的1.5倍,以控件高度為基準(zhǔn),重新縮放圖片 * */ public class LongImageView extends View { private int width, height; //需要繪制的Bitmap private Bitmap bitmap; /** * 需要繪制的圖片的區(qū)域 */ private Rect srcRect; /** * 繪制的區(qū)域 */ private RectF dstRectF; /** * 畫筆 */ private Paint paint; /** * 是否需要滑動(dòng) */ private boolean isNeedSlide; /** * 已經(jīng)滑動(dòng)過的距離 */ private float slideLength; /** * 繪制的Bitmap */ private Bitmap drawBitmap; { srcRect = new Rect(); dstRectF = new RectF(); paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.BLACK); paint.setStrokeWidth(1.0f); } public LongImageView(Context context) { super(context); } public LongImageView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public LongImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public LongImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } /** * 設(shè)置Bitmap * * @param bitmap * 需要繪制的Bitmap */ public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int specSize = MeasureSpec.getSize(widthMeasureSpec); width = getPaddingLeft() + getPaddingRight() + specSize; specSize = MeasureSpec.getSize(heightMeasureSpec); height = getPaddingTop() + getPaddingBottom() + specSize; if (drawBitmap == null) { drawBitmap = resizeImage(bitmap, width); if (drawBitmap.getHeight() > 1.5 * height) { //需要滑動(dòng) setNeedSlide(true); } else { //不需要滑動(dòng) setNeedSlide(false); srcRect.left = 0; srcRect.top = 0; srcRect.right = drawBitmap.getWidth(); srcRect.bottom = drawBitmap.getHeight(); if (drawBitmap.getHeight() > height) { drawBitmap = resizeImageH(drawBitmap, height - 20); } else { float space = (height - drawBitmap.getHeight()); dstRectF.left = 0; dstRectF.top = space; dstRectF.right = width; dstRectF.bottom = height - space; } } } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(drawBitmap, (width - drawBitmap.getWidth()) / 2, slideLength, paint); } /** * 設(shè)置是否需要滑動(dòng) * * @param needSlide * true or false */ public void setNeedSlide(boolean needSlide) { isNeedSlide = needSlide; } /** * 觸摸操作的坐標(biāo) */ private float lastX; private float lastY; @Override public boolean onTouchEvent(MotionEvent event) { if (!isNeedSlide) { return super.onTouchEvent(event); } int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: //按下 lastX = event.getX(); lastY = event.getY(); break; case MotionEvent.ACTION_MOVE: float moveX = event.getX(); if (moveX - lastX > 50) { //判斷為左右滑動(dòng) return super.onTouchEvent(event); } float moveY = event.getY(); float distance = moveY - lastY; lastY = moveY; slideLength += distance; if (slideLength >= 0) { slideLength = 0; } if (slideLength <= (-1) * (drawBitmap.getHeight() - height)) { slideLength = (-1) * (drawBitmap.getHeight() - height); } postInvalidate(); break; default: break; } return true; } public Bitmap resizeImage(Bitmap bitmap, int w) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); float scaleWidth = ((float) w) / width; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleWidth); return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); } public Bitmap resizeImageH(Bitmap bitmap, int h) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); float scaleWidth = ((float) h) / height; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleWidth); return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); } }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android如何使用Glide加載清晰長圖
- android實(shí)現(xiàn)長圖加載效果
- Android 官推 kotlin-first 的圖片加載庫——Coil的使用入門
- Android如何加載Base64編碼格式圖片
- Android Fresco圖片加載優(yōu)化的方案
- Android實(shí)現(xiàn)圖片加載進(jìn)度提示
- Android適配利用webview加載后圖片顯示過大的問題解決
- Android框架Volley之利用Imageloader和NetWorkImageView加載圖片的方法
- Android框架Volley使用:ImageRequest請(qǐng)求實(shí)現(xiàn)圖片加載
- Android高效安全加載圖片的方法詳解
- Android加載長圖的多種方案分享
相關(guān)文章
Android中TextView實(shí)現(xiàn)分段顯示不同顏色的字符串
在做項(xiàng)目的時(shí)候,遇到過一行文字有兩種顏色。在菜鳥的時(shí)候直接會(huì)想到用多個(gè)TextView來實(shí)現(xiàn),所以下面這篇文章主要給大家介紹了關(guān)于Android中TextView如何實(shí)現(xiàn)分段顯示不同顏色字符串的相關(guān)資料,需要的朋友可以參考下。2017-12-12Android開發(fā)之BottomSheetDialog組件的使用
BottomSheetDialog是底部操作控件,可在屏幕底部創(chuàng)建一個(gè)支持滑動(dòng)關(guān)閉視圖。本文將通過示例詳細(xì)講解它的使用,感興趣的小伙伴可以了解一下2023-01-01Android自定義View實(shí)現(xiàn)彈性小球效果
前段時(shí)間看到一個(gè)功能,是一個(gè)小球沿著固定軌跡彈動(dòng)的效果,那么這篇文章小編給大家分享在Android中如何自定義View來實(shí)現(xiàn)彈性小球的效果,有需要的可以參考借鑒。2016-09-09Android中ContentProvider和ContentResolver詳解
這篇文章主要介紹了Android中ContentProvider和ContentResolver詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Android進(jìn)階事件分發(fā)機(jī)制解決事件沖突
這篇文章主要為大家介紹了Android進(jìn)階事件分發(fā)機(jī)制解決事件沖突過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android中實(shí)現(xiàn)基本的短信攔截功能的代碼示例
這篇文章主要介紹了Android中實(shí)現(xiàn)基本短信攔截功能的代碼示例,這里之突出核心部分針對(duì)一個(gè)號(hào)碼,當(dāng)然程序擴(kuò)充后可以制定更多攔截規(guī)則,需要的朋友可以參考下2016-04-04android實(shí)現(xiàn)驗(yàn)證碼按鈕
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)驗(yàn)證碼按鈕功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android 仿抖音的評(píng)論列表的UI和效果的實(shí)現(xiàn)代碼
抖音是一款音樂創(chuàng)意短視頻社交軟件,此app已在android各大應(yīng)用商店和app store 上線。下面小編給大家?guī)砹薃ndroid 仿抖音的評(píng)論列表的UI和效果的實(shí)現(xiàn)代碼,感興趣的朋友參考下吧2018-03-03