11d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall/*
21d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall * Copyright 2014 The Android Open Source Project
31d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall *
41d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall * Licensed under the Apache License, Version 2.0 (the "License");
51d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall * you may not use this file except in compliance with the License.
61d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall * You may obtain a copy of the License at
71d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall *
81d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall *       http://www.apache.org/licenses/LICENSE-2.0
91d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall *
101d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall * Unless required by applicable law or agreed to in writing, software
111d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall * distributed under the License is distributed on an "AS IS" BASIS,
121d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall * See the License for the specific language governing permissions and
141d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall * limitations under the License.
151d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall */
161d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall
171d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wallpackage com.example.android.powerprofile.cameraavg;
181d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall
191d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wallimport android.content.Context;
201d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wallimport android.util.AttributeSet;
211d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wallimport android.view.TextureView;
221d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall
231d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall/**
241d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall * A {@link TextureView} that can be adjusted to a specified aspect ratio.
251d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall */
261d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wallpublic class AutoFitTextureView extends TextureView {
271d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall
281d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    private int mRatioWidth = 0;
291d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    private int mRatioHeight = 0;
301d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall
311d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    public AutoFitTextureView(Context context) {
321d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        this(context, null);
331d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    }
341d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall
351d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    public AutoFitTextureView(Context context, AttributeSet attrs) {
361d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        this(context, attrs, 0);
371d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    }
381d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall
391d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    public AutoFitTextureView(Context context, AttributeSet attrs, int defStyle) {
401d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        super(context, attrs, defStyle);
411d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    }
421d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall
431d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    /**
441d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall     * Sets the aspect ratio for this view. The size of the view will be measured based on the ratio
451d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall     * calculated from the parameters. Note that the actual sizes of parameters don't matter, that
461d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall     * is, calling setAspectRatio(2, 3) and setAspectRatio(4, 6) make the same result.
471d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall     *
481d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall     * @param width  Relative horizontal size
491d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall     * @param height Relative vertical size
501d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall     */
511d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    public void setAspectRatio(int width, int height) {
521d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        if (width < 0 || height < 0) {
531d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall            throw new IllegalArgumentException("Size cannot be negative.");
541d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        }
551d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        mRatioWidth = width;
561d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        mRatioHeight = height;
571d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        requestLayout();
581d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    }
591d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall
601d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    @Override
611d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
621d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
631d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        int width = MeasureSpec.getSize(widthMeasureSpec);
641d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        int height = MeasureSpec.getSize(heightMeasureSpec);
651d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        if (0 == mRatioWidth || 0 == mRatioHeight) {
661d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall            setMeasuredDimension(width, height);
671d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        } else {
681d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall            if (width < height * mRatioWidth / mRatioHeight) {
691d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall                setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
701d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall            } else {
711d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall                setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
721d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall            }
731d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall        }
741d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall    }
751d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall
761d110d812ca041a87a08a291dbf1d7f6f0c11c29Marissa Wall}
77