code: package it.mibiolab.clapp;
  
  /*
   * Copyright 2014 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *       http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  /*
  This is a modified version of the original class from the AOSP project.
   */
  
  import android.content.Context;
  import android.util.AttributeSet;
  import android.util.Log;
  import android.view.TextureView;
  
  /**
   * A {@link TextureView} that can be adjusted to a specified aspect ratio.
   */
  public class AutoFitTextureView extends TextureView {
  
      private int mRatioWidth = 0;
      private int mRatioHeight = 0;
  
      public AutoFitTextureView(Context context) {
          this(context, null);
      }
  
      public AutoFitTextureView(Context context, AttributeSet attrs) {
          this(context, attrs, 0);
      }
  
      public AutoFitTextureView(Context context, AttributeSet attrs, int defStyle) {
          super(context, attrs, defStyle);
      }
  
      /**
       * Sets the aspect ratio for this view. The size of the view will be measured based on the ratio
       * calculated from the parameters. Note that the actual sizes of parameters don't matter, that
       * is, calling setAspectRatio(2, 3) and setAspectRatio(4, 6) make the same result.
       *
       * @param width  Relative horizontal size
       * @param height Relative vertical size
       */
      public void setAspectRatio(int width, int height) {
          if (width < 0 || height < 0) {
              throw new IllegalArgumentException("Size cannot be negative.");
          }
          mRatioWidth = width;
          mRatioHeight = height;
          requestLayout();
      }
  
      @Override
      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
          super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  
          Log.d("Autofit", "On measure. Ratio: " + mRatioWidth + ", " + mRatioHeight);
  
          int width = MeasureSpec.getSize(widthMeasureSpec);
          int height = MeasureSpec.getSize(heightMeasureSpec);
  
          Log.d("Autofit", "On measure. Spec: " + width + ", " + height);
  
          if (0 == mRatioWidth || 0 == mRatioHeight) {
              setMeasuredDimension(width, height);
          } else {
              int bestW, bestH;
              if (width < height * mRatioWidth / mRatioHeight) {
                  bestW = width;
                  bestH = width * mRatioHeight / mRatioWidth;
  
              } else {
                  bestW = height * mRatioWidth / mRatioHeight;
                  bestH = height;
              }
  
  
              Log.d("Autofit", "Answer: " + bestW + ", " + bestH);
              Log.d("Autofit", "-----------------------------------");
  
              setMeasuredDimension(bestW, bestH);
          }
      }
  
  }
  
  