首页 > 系统 > Android > 正文

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

2019-10-22 18:20:20
字体:
来源:转载
供稿:网友

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

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表