Support aspect ratio change in PiP demo
For testing and demo purpose, currently support selecting from well defined list of aspect ratio, include 21:9, 16:9, 1:1, 9:16 and 9:21 Video: http://recall/-/aaaaaabFQoRHlzixHdtY/gqFQI7mpeQ6EZZ5JibsV6R Bug: 198643358 Test: Change aspect ratio within the app, see video Change-Id: I0580dc45bf32e795fefd7d80f5183f268f810790
This commit is contained in:
@@ -102,6 +102,24 @@
|
||||
|
||||
</RadioGroup>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="8dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/label_aspect_ratio" />
|
||||
|
||||
<Spinner
|
||||
android:id="@+id/aspect_ratio"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1" />
|
||||
</LinearLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/enter_pip_button"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
<!-- Note that app:aspectRatio can be changed dynamically. -->
|
||||
<com.example.android.apis.view.FixedAspectRatioImageView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
|
||||
@@ -74,6 +74,15 @@
|
||||
<string name="label_exit_position">Exit position</string>
|
||||
<string name="label_position_start">Start</string>
|
||||
<string name="label_position_end">End</string>
|
||||
<string name="label_aspect_ratio">Aspect Ratio</string>
|
||||
<!-- List of aspect ratio to demo, we use Rational.parseRational to parse what's inside () -->
|
||||
<string-array name="aspect_ratio_list">
|
||||
<item>Extreme wide (21/9)</item>
|
||||
<item>Video (16/9)</item>
|
||||
<item>Square (1/1)</item>
|
||||
<item>Video call (9/16)</item>
|
||||
<item>Extreme tall (9/21)</item>
|
||||
</string-array>
|
||||
|
||||
<string name="activity_keep_clear">App/Activity/Keep Clear Rects</string>
|
||||
<string name="keep_clear_property_set">
|
||||
|
||||
@@ -39,14 +39,18 @@ import android.util.Rational;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.Switch;
|
||||
import android.window.OnBackInvokedDispatcher;
|
||||
|
||||
import com.example.android.apis.R;
|
||||
import com.example.android.apis.view.FixedAspectRatioImageView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -57,6 +61,7 @@ public class PictureInPicture extends Activity {
|
||||
private static final String EXTRA_ENABLE_SEAMLESS_RESIZE = "seamless_resize";
|
||||
private static final String EXTRA_ENTER_PIP_ON_BACK = "enter_pip_on_back";
|
||||
private static final String EXTRA_CURRENT_POSITION = "current_position";
|
||||
private static final String EXTRA_ASPECT_RATIO = "aspect_ratio";
|
||||
|
||||
private static final int TABLET_BREAK_POINT_DP = 700;
|
||||
|
||||
@@ -95,13 +100,14 @@ public class PictureInPicture extends Activity {
|
||||
(v, id) -> updateContentPosition(id);
|
||||
|
||||
private LinearLayout mContainer;
|
||||
private ImageView mImageView;
|
||||
private FixedAspectRatioImageView mImageView;
|
||||
private View mControlGroup;
|
||||
private Switch mAutoPipToggle;
|
||||
private Switch mSourceRectHintToggle;
|
||||
private Switch mSeamlessResizeToggle;
|
||||
private Switch mEnterPipOnBackToggle;
|
||||
private RadioGroup mCurrentPositionGroup;
|
||||
private Spinner mAspectRatioSpinner;
|
||||
private List<RemoteAction> mPipActions;
|
||||
private RemoteAction mCloseAction;
|
||||
|
||||
@@ -119,6 +125,13 @@ public class PictureInPicture extends Activity {
|
||||
mSeamlessResizeToggle = findViewById(R.id.seamless_resize_toggle);
|
||||
mEnterPipOnBackToggle = findViewById(R.id.enter_pip_on_back);
|
||||
mCurrentPositionGroup = findViewById(R.id.current_position);
|
||||
mAspectRatioSpinner = findViewById(R.id.aspect_ratio);
|
||||
|
||||
// Initiate views if applicable
|
||||
final ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
|
||||
R.array.aspect_ratio_list, android.R.layout.simple_spinner_item);
|
||||
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
mAspectRatioSpinner.setAdapter(adapter);
|
||||
|
||||
// Attach listeners
|
||||
mImageView.addOnLayoutChangeListener(mOnLayoutChangeListener);
|
||||
@@ -135,6 +148,22 @@ public class PictureInPicture extends Activity {
|
||||
}
|
||||
});
|
||||
mCurrentPositionGroup.setOnCheckedChangeListener(mOnPositionChangedListener);
|
||||
mAspectRatioSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
final String rawText = parent.getItemAtPosition(position).toString();
|
||||
final String textToParse = rawText.substring(
|
||||
rawText.indexOf('(') + 1,
|
||||
rawText.indexOf(')'));
|
||||
mImageView.addOnLayoutChangeListener(mOnLayoutChangeListener);
|
||||
mImageView.setAspectRatio(Rational.parseRational(textToParse));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> parent) {
|
||||
// Do nothing.
|
||||
}
|
||||
});
|
||||
findViewById(R.id.enter_pip_button).setOnClickListener(v -> enterPictureInPictureMode());
|
||||
findViewById(R.id.enter_content_pip_button).setOnClickListener(v -> enterContentPip());
|
||||
|
||||
@@ -152,6 +181,7 @@ public class PictureInPicture extends Activity {
|
||||
? R.id.radio_current_end
|
||||
: R.id.radio_current_start;
|
||||
mCurrentPositionGroup.check(positionId);
|
||||
mAspectRatioSpinner.setSelection(1);
|
||||
|
||||
updateLayout(getResources().getConfiguration());
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ import com.example.android.apis.R;
|
||||
* one of the dimension is in exact while the other one in wrap_content size mode.
|
||||
*/
|
||||
public class FixedAspectRatioImageView extends ImageView {
|
||||
private final Rational mAspectRatio;
|
||||
private Rational mAspectRatio;
|
||||
|
||||
public FixedAspectRatioImageView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
@@ -43,6 +43,13 @@ public class FixedAspectRatioImageView extends ImageView {
|
||||
}
|
||||
}
|
||||
|
||||
public void setAspectRatio(Rational aspectRatio) {
|
||||
if (!mAspectRatio.equals(aspectRatio)) {
|
||||
mAspectRatio = aspectRatio;
|
||||
requestLayout();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
Reference in New Issue
Block a user