热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要为大家详细介绍了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); 
  } 
 
} 

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


推荐阅读
  • 本文详细介绍了如何在Python3环境中配置Appium1.4.6,并指导如何连接模拟器进行自动化测试。通过本文,您将了解从环境搭建到模拟器连接的完整流程。 ... [详细]
  • CentOS 7.2 配置防火墙端口开放
    本文介绍如何在 CentOS 7.2 系统上配置防火墙以开放特定的服务端口,包括 FTP 服务的临时与永久开放方法,以及如何验证配置是否生效。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • 本文探讨了如何利用SqlDependency执行复杂的SQL查询,并确保在多线程环境下的安全性与效率。 ... [详细]
  • Python数据类型6 字典
    字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包 ... [详细]
  • 本文详细介绍了ActivityManagerService (AMS) 的工作原理及其在Android系统中的重要角色。AMS作为system_server进程的一部分,在系统启动时加载,负责管理和协调应用程序中的Activity和服务(Service)。文章将通过具体的接口图和通信流程,帮助读者更好地理解AMS的工作机制。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 题目 CF1245F: 清理春天的数学挑战 描述了一个数学问题:给定一个区间 [L, R](0 ≤ L, R ≤ 10^9),求该区间内满足 x + y = x ∧ y 的数对 (x, y) 的总数。 ... [详细]
  • 探讨在Android JNI/NDK环境中遇到的SIGSEGV崩溃问题,以及如何通过自定义信号处理器进行调试的方法。 ... [详细]
  • 三星Galaxy S8/S8+即将登场,全面解析新旗舰
    3月29日晚11点,备受瞩目的三星Galaxy S8/S8+将正式发布。作为三星在Note 7爆炸事件后的重磅产品,S8/S8+不仅承载着恢复消费者信心的重任,其创新的设计和技术也备受期待。 ... [详细]
  • 本文详细介绍了在使用Socket进行网络编程时,遇到链接器错误`undefined reference to WSAStartup@8`的解决方案,适用于多种开发环境。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • LCUI 2.1.0 版本现已推出,这是一个用 C 语言编写的图形用户界面开发库,适合创建轻量级的桌面应用程序。此次更新包括多项修复和功能增强,并正式宣布将启动 Android 支持的开发计划。 ... [详细]
  • Android手机用户如何轻松连接蓝牙耳机
    对于拥有Android智能手机的用户来说,连接蓝牙耳机不仅操作简便,还能极大地提升日常听音乐、通话或游戏体验的质量。 ... [详细]
author-avatar
无为南子_274
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有