Android仿微博加载长图滚动查看效果

本文实例为大家分享了Android加载长图片的具体代码,供大家参考,具体内容如下

解决步骤

1.将图片缩放到与控件等宽

2.判断缩放后的图片高度,如果高度大于控件高度较多(这里设置的是1.5倍),认定为长图,可滑动查看图片

                     |-如果高度小于控件高度的1.5倍,以控件高度为基准,重新缩放图片

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.判断缩放后的图片高度,如果高度大于控件高度较多(这里设置的是1.5倍),认定为长图,可滑动查看图片

* |-如果高度小于控件高度的1.5倍,以控件高度为基准,重新缩放图片

*

*/

public class LongImageView extends View {

private int width, height;

//需要绘制的Bitmap

private Bitmap bitmap;

/**

* 需要绘制的图片的区域

*/

private Rect srcRect;

/**

* 绘制的区域

*/

private RectF dstRectF;

/**

* 画笔

*/

private Paint paint;

/**

* 是否需要滑动

*/

private boolean isNeedSlide;

/**

* 已经滑动过的距离

*/

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);

}

/**

* 设置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) {

//需要滑动

setNeedSlide(true);

} else {

//不需要滑动

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);

}

/**

* 设置是否需要滑动

*

* @param needSlide

* true or false

*/

public void setNeedSlide(boolean needSlide) {

isNeedSlide = needSlide;

}

/**

* 触摸操作的坐标

*/

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) {

//判断为左右滑动

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);

}

}

以上是 Android仿微博加载长图滚动查看效果 的全部内容, 来源链接: utcz.com/z/329231.html

回到顶部