Android加载长图,仿微博长图滚动查看
2017-03-09 13:40
751 查看
/** * Created by sunrui on 2017/3/8. * 加载长图片 * 解决步骤 * 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仿微博加载长图滚动查看效果
- Android加载超长图(微博长图)
- Android 图片预览器加载微博长图,大图
- Android 微博长图加载
- Android中加载长图的策略(微博的那种)
- [Android]ListView 滚动翻页/滚动加载(类似QQ空间滚动加载页面)
- android listview 滚动时异步加载图片的问题
- Android腾讯微薄客户端开发八:微博查看(转播,对话,点评)
- ListView滚动加载(类似Android Market的列表)
- android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)
- jquery模仿微博向下滚动到页面底部时实时加载新内容
- 今天分享一个Android ListView滚动进度加载的实例
- Android ListView 滚动加载数据
- 仿微博 无限滚动加载技术
- android,微信,人人,<android 无标题栏 >微博开机加载一幅图片,再跳转到主应用的实现
- android ListView监听滚动条滚动到底部时继续加载
- 学习开发新浪微博android客户端的一些事儿---刷新微博与加载更多微博
- ListView 实现像Android Market那样 分页加载 滚动加载
- android listView 滚动加载显示
- android listview 滚动时异步加载图片的问题