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的使用入門
- 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)文章
Flutter實(shí)現(xiàn)用視頻背景的登錄頁(yè)的示例代碼
這篇文章主要介紹了Flutter實(shí)現(xiàn)用視頻背景的登錄頁(yè)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Android之用PopupWindow實(shí)現(xiàn)彈出菜單的方法詳解
本篇文章是對(duì)在Android中,用PopupWindow實(shí)現(xiàn)彈出菜單的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Flutter質(zhì)感設(shè)計(jì)之彈出菜單
這篇文章主要為大家詳細(xì)介紹了Flutter質(zhì)感設(shè)計(jì)之彈出菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android 自定義一套 Dialog通用提示框 (代碼庫(kù))
這篇文章主要介紹了Android 自定義一套 Dialog通用提示框 (代碼庫(kù)),需要的朋友可以參考下2017-04-04
Android實(shí)現(xiàn)粒子漩渦動(dòng)畫(huà)
粒子動(dòng)畫(huà)經(jīng)常用于大畫(huà)幅的渲染效果,實(shí)際上難度并不高,但是在使用粒子動(dòng)畫(huà)時(shí),必須要遵循的一些要素,起點(diǎn),矢量速度和符合運(yùn)動(dòng)學(xué)公式等,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-01-01
Android獲取手機(jī)通訊錄、sim卡聯(lián)系人及調(diào)用撥號(hào)界面方法
這篇文章主要介紹了Android獲取手機(jī)通訊錄、sim卡聯(lián)系人及調(diào)用撥號(hào)界面方法,本文分別給出實(shí)現(xiàn)代碼實(shí)現(xiàn)獲取通訊錄和sim卡的聯(lián)系人,以及權(quán)限配置和調(diào)用系統(tǒng)撥打電話的界面的實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04
Android觸摸及手勢(shì)操作GestureDetector
這篇文章主要a為大家詳細(xì)介紹了Android觸摸及手勢(shì)操作GestureDetector的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-07-07
Android編程實(shí)現(xiàn)二維碼的生成與解析
這篇文章主要介紹了Android編程實(shí)現(xiàn)二維碼的生成與解析方法,結(jié)合實(shí)例分析了Android二維碼的生成與讀取二維碼的相關(guān)技巧,并提供了二維碼jar包供讀者下載,需要的朋友可以參考下2015-11-11
android viewpager實(shí)現(xiàn)豎直滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了android viewpager實(shí)現(xiàn)豎直滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android DrawerLayout帶有側(cè)滑功能的布局類(1)
這篇文章主要為大家詳細(xì)介紹了Android DrawerLayout帶有側(cè)滑功能的布局類,感興趣的小伙伴們可以參考一下2016-07-07

