Android仿微博加載長(zhǎng)圖滾動(dòng)查看效果
本文實(shí)例為大家分享了Android加載長(zhǎng)圖片的具體代碼,供大家參考,具體內(nèi)容如下
解決步驟
1.將圖片縮放到與控件等寬
2.判斷縮放后的圖片高度,如果高度大于控件高度較多(這里設(shè)置的是1.5倍),認(rèn)定為長(zhǎng)圖,可滑動(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.
* 加載長(zhǎng)圖片
* 解決步驟
* 1.將圖片縮放到與控件等寬
* 2.判斷縮放后的圖片高度,如果高度大于控件高度較多(這里設(shè)置的是1.5倍),認(rèn)定為長(zhǎng)圖,可滑動(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;
/**
* 畫(huà)筆
*/
private Paint paint;
/**
* 是否需要滑動(dòng)
*/
private boolean isNeedSlide;
/**
* 已經(jīng)滑動(dòng)過(guò)的距離
*/
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);
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android如何使用Glide加載清晰長(zhǎng)圖
- android實(shí)現(xiàn)長(zhǎng)圖加載效果
- Android 官推 kotlin-first 的圖片加載庫(kù)——Coil的使用入門(mén)
- Android如何加載Base64編碼格式圖片
- Android Fresco圖片加載優(yōu)化的方案
- Android實(shí)現(xiàn)圖片加載進(jìn)度提示
- Android適配利用webview加載后圖片顯示過(guò)大的問(wèn)題解決
- Android框架Volley之利用Imageloader和NetWorkImageView加載圖片的方法
- Android框架Volley使用:ImageRequest請(qǐng)求實(shí)現(xiàn)圖片加載
- Android高效安全加載圖片的方法詳解
- Android加載長(zhǎng)圖的多種方案分享
相關(guān)文章
Android中TextView實(shí)現(xiàn)分段顯示不同顏色的字符串
在做項(xiàng)目的時(shí)候,遇到過(guò)一行文字有兩種顏色。在菜鳥(niǎo)的時(shí)候直接會(huì)想到用多個(gè)TextView來(lái)實(shí)現(xiàn),所以下面這篇文章主要給大家介紹了關(guān)于Android中TextView如何實(shí)現(xiàn)分段顯示不同顏色字符串的相關(guān)資料,需要的朋友可以參考下。2017-12-12
Android開(kāi)發(fā)之BottomSheetDialog組件的使用
BottomSheetDialog是底部操作控件,可在屏幕底部創(chuàng)建一個(gè)支持滑動(dòng)關(guān)閉視圖。本文將通過(guò)示例詳細(xì)講解它的使用,感興趣的小伙伴可以了解一下2023-01-01
Android自定義View實(shí)現(xiàn)彈性小球效果
前段時(shí)間看到一個(gè)功能,是一個(gè)小球沿著固定軌跡彈動(dòng)的效果,那么這篇文章小編給大家分享在Android中如何自定義View來(lái)實(shí)現(xiàn)彈性小球的效果,有需要的可以參考借鑒。2016-09-09
Android中ContentProvider和ContentResolver詳解
這篇文章主要介紹了Android中ContentProvider和ContentResolver詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android進(jìn)階事件分發(fā)機(jī)制解決事件沖突
這篇文章主要為大家介紹了Android進(jìn)階事件分發(fā)機(jī)制解決事件沖突過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android中實(shí)現(xiàn)基本的短信攔截功能的代碼示例
這篇文章主要介紹了Android中實(shí)現(xiàn)基本短信攔截功能的代碼示例,這里之突出核心部分針對(duì)一個(gè)號(hào)碼,當(dāng)然程序擴(kuò)充后可以制定更多攔截規(guī)則,需要的朋友可以參考下2016-04-04
android實(shí)現(xiàn)驗(yàn)證碼按鈕
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)驗(yàn)證碼按鈕功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android 仿抖音的評(píng)論列表的UI和效果的實(shí)現(xiàn)代碼
抖音是一款音樂(lè)創(chuàng)意短視頻社交軟件,此app已在android各大應(yīng)用商店和app store 上線。下面小編給大家?guī)?lái)了Android 仿抖音的評(píng)論列表的UI和效果的實(shí)現(xiàn)代碼,感興趣的朋友參考下吧2018-03-03

