亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android仿微博加載長圖滾動(dòng)查看效果

 更新時(shí)間:2017年12月14日 14:13:14   作者:姜瀾很懶  
這篇文章主要為大家詳細(xì)介紹了Android仿微博加載長圖滾動(dòng)查看效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android加載長圖片的具體代碼,供大家參考,具體內(nèi)容如下

解決步驟

1.將圖片縮放到與控件等寬
2.判斷縮放后的圖片高度,如果高度大于控件高度較多(這里設(shè)置的是1.5倍),認(rèn)定為長圖,可滑動(dòng)查看圖片
                     |-如果高度小于控件高度的1.5倍,以控件高度為基準(zhǔn),重新縮放圖片

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.判斷縮放后的圖片高度,如果高度大于控件高度較多(這里設(shè)置的是1.5倍),認(rèn)定為長圖,可滑動(dòng)查看圖片 
 *           |-如果高度小于控件高度的1.5倍,以控件高度為基準(zhǔn),重新縮放圖片 
 * 
 */ 
public class LongImageView extends View { 
 
  private int width, height; 
 
  //需要繪制的Bitmap 
  private Bitmap bitmap; 
 
  /** 
   * 需要繪制的圖片的區(qū)域 
   */ 
  private Rect srcRect; 
 
  /** 
   * 繪制的區(qū)域 
   */ 
  private RectF dstRectF; 
 
  /** 
   * 畫筆 
   */ 
  private Paint paint; 
 
 
  /** 
   * 是否需要滑動(dòng) 
   */ 
  private boolean isNeedSlide; 
 
  /** 
   * 已經(jīng)滑動(dòng)過的距離 
   */ 
  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); 
  } 
 
  /** 
   * 設(shè)置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) { 
        //需要滑動(dòng) 
        setNeedSlide(true); 
      } else { 
        //不需要滑動(dòng) 
        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); 
  } 
 
  /** 
   * 設(shè)置是否需要滑動(dòng) 
   * 
   * @param needSlide 
   *     true or false 
   */ 
  public void setNeedSlide(boolean needSlide) { 
    isNeedSlide = needSlide; 
  } 
 
  /** 
   * 觸摸操作的坐標(biāo) 
   */ 
  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) { 
          //判斷為左右滑動(dòng) 
          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); 
  } 
 
} 

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Android WebView加載html片段

    詳解Android WebView加載html片段

    本篇文章主要介紹了詳解Android WebView加載html片段,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Android中TextView實(shí)現(xiàn)分段顯示不同顏色的字符串

    Android中TextView實(shí)現(xiàn)分段顯示不同顏色的字符串

    在做項(xiàng)目的時(shí)候,遇到過一行文字有兩種顏色。在菜鳥的時(shí)候直接會(huì)想到用多個(gè)TextView來實(shí)現(xiàn),所以下面這篇文章主要給大家介紹了關(guān)于Android中TextView如何實(shí)現(xiàn)分段顯示不同顏色字符串的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12
  • Android開發(fā)之BottomSheetDialog組件的使用

    Android開發(fā)之BottomSheetDialog組件的使用

    BottomSheetDialog是底部操作控件,可在屏幕底部創(chuàng)建一個(gè)支持滑動(dòng)關(guān)閉視圖。本文將通過示例詳細(xì)講解它的使用,感興趣的小伙伴可以了解一下
    2023-01-01
  • Android自定義View實(shí)現(xiàn)彈性小球效果

    Android自定義View實(shí)現(xiàn)彈性小球效果

    前段時(shí)間看到一個(gè)功能,是一個(gè)小球沿著固定軌跡彈動(dòng)的效果,那么這篇文章小編給大家分享在Android中如何自定義View來實(shí)現(xiàn)彈性小球的效果,有需要的可以參考借鑒。
    2016-09-09
  • Android 判斷是否連接成功了指定wifi

    Android 判斷是否連接成功了指定wifi

    本文主要介紹了Android 判斷是否連接成功了指定wifi的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04
  • Android中ContentProvider和ContentResolver詳解

    Android中ContentProvider和ContentResolver詳解

    這篇文章主要介紹了Android中ContentProvider和ContentResolver詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Android進(jìn)階事件分發(fā)機(jī)制解決事件沖突

    Android進(jìn)階事件分發(fā)機(jī)制解決事件沖突

    這篇文章主要為大家介紹了Android進(jìn)階事件分發(fā)機(jī)制解決事件沖突過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Android中實(shí)現(xiàn)基本的短信攔截功能的代碼示例

    Android中實(shí)現(xiàn)基本的短信攔截功能的代碼示例

    這篇文章主要介紹了Android中實(shí)現(xiàn)基本短信攔截功能的代碼示例,這里之突出核心部分針對(duì)一個(gè)號(hào)碼,當(dāng)然程序擴(kuò)充后可以制定更多攔截規(guī)則,需要的朋友可以參考下
    2016-04-04
  • android實(shí)現(xiàn)驗(yàn)證碼按鈕

    android實(shí)現(xiàn)驗(yàn)證碼按鈕

    這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)驗(yàn)證碼按鈕功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android 仿抖音的評(píng)論列表的UI和效果的實(shí)現(xiàn)代碼

    Android 仿抖音的評(píng)論列表的UI和效果的實(shí)現(xiàn)代碼

    抖音是一款音樂創(chuàng)意短視頻社交軟件,此app已在android各大應(yīng)用商店和app store 上線。下面小編給大家?guī)砹薃ndroid 仿抖音的評(píng)論列表的UI和效果的實(shí)現(xiàn)代碼,感興趣的朋友參考下吧
    2018-03-03

最新評(píng)論