国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

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

2019-10-22 18:13:04
字體:
來源:轉載
供稿:網友

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

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

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

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

那么既然知道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的預覽尺寸比例一致,且寬高記得傳正確,不然可能不全屏

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙游县| 苏尼特左旗| 运城市| 荣成市| 林芝县| 淮滨县| 湘潭市| 中阳县| 弥勒县| 城步| 伽师县| 太原市| 平度市| 浙江省| 玛沁县| 瓦房店市| 黄梅县| 上饶县| 台中县| 彩票| 汉阴县| 秦安县| 西昌市| 宁波市| 曲周县| 丹江口市| 禄劝| 南京市| 蒙阴县| 郴州市| 慈溪市| 屏东市| 视频| 南涧| 神农架林区| 陇南市| 阜阳市| 宜宾市| 牟定县| 稷山县| 牟定县|