您的位置:首页 > 移动开发 > Android开发

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

2017-12-14 14:13 483 查看

本文实例为大家分享了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);
}
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息