blob: 9d142064935a192bfa2b38619b7df8a9fae849bc [file] [log] [blame]
/*
* Copyright (C) 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.
*/
package com.example.android.elevationdrag;
import com.example.android.common.logger.Log;
import android.graphics.Outline;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
public class ElevationDragFragment extends Fragment {
public static final String TAG = "ElevationDragFragment";
/* The circular outline provider */
private ViewOutlineProvider mOutlineProviderCircle;
/* The current elevation of the floating view. */
private float mElevation = 0;
/* The step in elevation when changing the Z value */
private int mElevationStep;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mOutlineProviderCircle = new CircleOutlineProvider();
mElevationStep = getResources().getDimensionPixelSize(R.dimen.elevation_step);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.ztranslation, container, false);
/* Find the {@link View} to apply z-translation to. */
final View floatingShape = rootView.findViewById(R.id.circle);
/* Define the shape of the {@link View}'s shadow by setting one of the {@link Outline}s. */
floatingShape.setOutlineProvider(mOutlineProviderCircle);
/* Clip the {@link View} with its outline. */
floatingShape.setClipToOutline(true);
DragFrameLayout dragLayout = ((DragFrameLayout) rootView.findViewById(R.id.main_layout));
dragLayout.setDragFrameController(new DragFrameLayout.DragFrameLayoutController() {
@Override
public void onDragDrop(boolean captured) {
/* Animate the translation of the {@link View}. Note that the translation
is being modified, not the elevation. */
floatingShape.animate()
.translationZ(captured ? 50 : 0)
.setDuration(100);
Log.d(TAG, captured ? "Drag" : "Drop");
}
});
dragLayout.addDragView(floatingShape);
/* Raise the circle in z when the "z+" button is clicked. */
rootView.findViewById(R.id.raise_bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mElevation += mElevationStep;
Log.d(TAG, String.format("Elevation: %.1f", mElevation));
floatingShape.setElevation(mElevation);
}
});
/* Lower the circle in z when the "z-" button is clicked. */
rootView.findViewById(R.id.lower_bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mElevation -= mElevationStep;
// Don't allow for negative values of Z.
if (mElevation < 0) {
mElevation = 0;
}
Log.d(TAG, String.format("Elevation: %.1f", mElevation));
floatingShape.setElevation(mElevation);
}
});
return rootView;
}
/**
* ViewOutlineProvider which sets the outline to be an oval which fits the view bounds.
*/
private class CircleOutlineProvider extends ViewOutlineProvider {
@Override
public void getOutline(View view, Outline outline) {
outline.setOval(0, 0, view.getWidth(), view.getHeight());
}
}
}