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); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
相关文章推荐
- Android加载长图,仿微博长图滚动查看
- Android 微博长图加载
- Android 图片预览器加载微博长图,大图
- Android ListView 滚动翻页效果——加载更多
- android 实现在文本内容超过固定宽度可手动左右滚动查看效果
- Android中加载长图的策略(微博的那种)
- android 实现在文本内容超过固定宽度可手动左右滚动查看效果
- Android 自定义圆形旋转进度条,仿微博头像加载效果
- android 动态加载数据的滚动效果
- Android基于ListView实现类似QQ空间的滚动翻页与滚动加载效果
- Android加载超长图(微博长图)
- Android使用Recyclerview实现图片水平自动循环滚动效果
- 参考课堂案例jquery图片滚动效果实现微博首页内容滚动效
- android跑马灯效果实现(一直滚动不受影响)
- android使用ViewPager实现底部菜单栏和左右滑动效果,加载多个Activity
- Android TextView加载HTMl图文之添加点击事件和查看图片
- 2011-01-16 21:13 JQuery实现页面随滚动条滚动而动态加载内容的效果
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
- Android实现3D滚动效果
- js实现仿微博滚动显示信息的效果