最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android SurfaceView預覽變形完美解決方法

 更新時間:2018年04月10日 10:25:33   作者:KingVic  
本篇文章主要介紹了Android SurfaceView預覽變形完美解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

這個問題百度上一搜一大把,基本上都是說找到和SurfaceView的比例相近的camera預覽尺寸,但是發(fā)現(xiàn)預覽時候還是差了點意思,具體看下面這個回調就知道是為什么了。

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    Log.i(TAG, "surfaceChanged: " + width + " " + height);
  }

從上面的回調打印的數(shù)據(jù)知道其實取相近的比例解決不了根本問題

所以,對于此類的解決方法我只想說僅僅相近有神馬用。

那么既然知道surfaceChanged的寬高就是SurfaceView的渲染寬高,那么想辦法把surfaceChanged里的寬高比弄成和camera比例一樣不就行了嘛,所以看SurfaceView的源碼:

protected void updateWindow(boolean force, boolean redrawNeeded) {
    ...代碼省略

    int myWidth = mRequestedWidth;
    if (myWidth <= 0) myWidth = getWidth();
    int myHeight = mRequestedHeight;
    if (myHeight <= 0) myHeight = getHeight();

    ...代碼省略
      
    if (creating || formatChanged || sizeChanged
        || visibleChanged || realSizeChanged) {
      if (DEBUG) Log.i(TAG, System.identityHashCode(this) + " "
          + "surfaceChanged -- format=" + mFormat
          + " w=" + myWidth + " h=" + myHeight);
      if (callbacks == null) {
        callbacks = getSurfaceCallbacks();
      }
      for (SurfaceHolder.Callback c : callbacks) {
        c.surfaceChanged(mSurfaceHolder, mFormat, myWidth, myHeight);
      }
    }
    
    ...代碼省略
  }

可以看到寬高其實就是調用的View的getHeight和getWidth或者是mRequestedWidth和mRequestedHeight。

熟悉了View的自定義就知道getHeight和getWidth都是和View的onMeasure息息相關,所以想到重寫onMeasure方法。

再從源碼看到關于mRequestedWidth和mRequestedHeight的賦值

@Override
    public void setFixedSize(int width, int height) {
      if (mRequestedWidth != width || mRequestedHeight != height) {
        mRequestedWidth = width;
        mRequestedHeight = height;
        requestLayout();
      }
    }

以下是完整類代碼:

public class ResizeAbleSurfaceView extends SurfaceView {

  private int mWidth = -1;
  private int mHeight = -1;

  public ResizeAbleSurfaceView(Context context) {
    super(context);
  }

  public ResizeAbleSurfaceView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public ResizeAbleSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (-1 == mWidth || -1 == mHeight) {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
    else {
      setMeasuredDimension(mWidth, mHeight);
    }
  }

  public void resize(int width, int height) {
    mWidth = width;
    mHeight = height;
    getHolder().setFixedSize(width, height);
    requestLayout();
    invalidate(); 
  }
}

實例化的時候記得調用resize方法就好了。

注意和camera的預覽尺寸比例一致,且寬高記得傳正確,不然可能不全屏

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android非XML形式動態(tài)生成、調用頁面的方法

    Android非XML形式動態(tài)生成、調用頁面的方法

    這篇文章主要介紹了Android非XML形式動態(tài)生成、調用頁面的方法,涉及Android構建頁面的相關技巧,需要的朋友可以參考下
    2015-04-04
  • Flutter學習之創(chuàng)建一個內嵌的navigation詳解

    Flutter學習之創(chuàng)建一個內嵌的navigation詳解

    我們在flutter中可以使用Navigator.push或者Navigator.pushNamed方法來向Navigator中添加不同的頁面,從而達到頁面調整的目的。本文就來聊聊如何創(chuàng)建一個內嵌的navigation吧
    2023-03-03
  • 深入理解Android中的建造者模式

    深入理解Android中的建造者模式

    建造者模式將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創(chuàng)建不同的表示。所以這篇文章主要介紹了Android中的建造者模式,有需要的朋友們可以參考借鑒。
    2016-09-09
  • android獲取情景模式和鈴聲 實現(xiàn)震動、鈴聲提醒

    android獲取情景模式和鈴聲 實現(xiàn)震動、鈴聲提醒

    這篇文章主要介紹了android獲取情景模式和鈴聲,實現(xiàn)震動、鈴聲提醒,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android Java實現(xiàn)余弦匹配算法示例代碼

    Android Java實現(xiàn)余弦匹配算法示例代碼

    這篇文章主要介紹了Android Java實現(xiàn)余弦匹配算法示例代碼的相關資料,這里通過java 算法實現(xiàn)余弦匹配算法實現(xiàn)比較的實例,需要的朋友可以參考下
    2016-11-11
  • Android Parcleable接口的調用源碼層分析

    Android Parcleable接口的調用源碼層分析

    這篇文章主要給大家介紹了關于利用Kotlin如何實現(xiàn)Android開發(fā)中的Parcelable的相關資料,并且給大家介紹了關于Android Parcleable源碼層問題,需要的朋友可以參考下
    2022-12-12
  • RecyclerView實現(xiàn)拖拽排序效果

    RecyclerView實現(xiàn)拖拽排序效果

    這篇文章主要為大家詳細介紹了RecyclerView實現(xiàn)拖拽排序效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android 區(qū)別真機和模擬器的幾種方法

    Android 區(qū)別真機和模擬器的幾種方法

    本文主要介紹 Android 區(qū)別真機和模擬器,這里整理了幾種方式來辨別 真機和模擬器.希望能對有需要的小伙伴有所幫助
    2016-07-07
  • Android中外接鍵盤的檢測的實現(xiàn)

    Android中外接鍵盤的檢測的實現(xiàn)

    這篇文章主要介紹了Android中外接鍵盤的檢測的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Android?Studio實現(xiàn)智能聊天

    Android?Studio實現(xiàn)智能聊天

    這篇文章主要為大家詳細介紹了Android?Studio實現(xiàn)智能聊天,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評論

施秉县| 西平县| 岳阳市| 清徐县| 新兴县| 呼伦贝尔市| 崇文区| 赤水市| 南阳市| 鹿泉市| 普安县| 浦城县| 山丹县| 湖北省| 仙桃市| 丽江市| 健康| 若尔盖县| 齐齐哈尔市| 宜宾市| 承德市| 武平县| 开远市| 尖扎县| 延津县| 马公市| 灵川县| 勐海县| 侯马市| 通榆县| 洛阳市| 龙海市| 西畴县| 宜良县| 开阳县| 长武县| 岚皋县| 迭部县| 涞源县| 萨迦县| 翼城县|