blob: d5f7b39b8e61260a6f98222274308a0a08f62440 [file] [log] [blame]
/*
* Copyright (C) 2015 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.android.systemui.stackdivider;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.annotation.Nullable;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Property;
import android.view.View;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
/**
* View for the handle in the docked stack divider.
*/
public class DividerHandleView extends View {
private final static Property<DividerHandleView, Integer> WIDTH_PROPERTY
= new Property<DividerHandleView, Integer>(Integer.class, "width") {
@Override
public Integer get(DividerHandleView object) {
return object.mCurrentWidth;
}
@Override
public void set(DividerHandleView object, Integer value) {
object.mCurrentWidth = value;
object.invalidate();
}
};
private final static Property<DividerHandleView, Integer> HEIGHT_PROPERTY
= new Property<DividerHandleView, Integer>(Integer.class, "height") {
@Override
public Integer get(DividerHandleView object) {
return object.mCurrentHeight;
}
@Override
public void set(DividerHandleView object, Integer value) {
object.mCurrentHeight = value;
object.invalidate();
}
};
private final Paint mPaint = new Paint();
private final int mWidth;
private final int mHeight;
private final int mCircleDiameter;
private int mCurrentWidth;
private int mCurrentHeight;
private AnimatorSet mAnimator;
private boolean mTouching;
public DividerHandleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mPaint.setColor(getResources().getColor(R.color.docked_divider_handle, null));
mPaint.setAntiAlias(true);
mWidth = getResources().getDimensionPixelSize(R.dimen.docked_divider_handle_width);
mHeight = getResources().getDimensionPixelSize(R.dimen.docked_divider_handle_height);
mCurrentWidth = mWidth;
mCurrentHeight = mHeight;
mCircleDiameter = (mWidth + mHeight) / 3;
}
public void setTouching(boolean touching, boolean animate) {
if (touching == mTouching) {
return;
}
if (mAnimator != null) {
mAnimator.cancel();
mAnimator = null;
}
if (!animate) {
if (touching) {
mCurrentWidth = mCircleDiameter;
mCurrentHeight = mCircleDiameter;
} else {
mCurrentWidth = mWidth;
mCurrentHeight = mHeight;
}
invalidate();
} else {
animateToTarget(touching ? mCircleDiameter : mWidth,
touching ? mCircleDiameter : mHeight, touching);
}
mTouching = touching;
}
private void animateToTarget(int targetWidth, int targetHeight, boolean touching) {
ObjectAnimator widthAnimator = ObjectAnimator.ofInt(this, WIDTH_PROPERTY,
mCurrentWidth, targetWidth);
ObjectAnimator heightAnimator = ObjectAnimator.ofInt(this, HEIGHT_PROPERTY,
mCurrentHeight, targetHeight);
mAnimator = new AnimatorSet();
mAnimator.playTogether(widthAnimator, heightAnimator);
mAnimator.setDuration(touching
? DividerView.TOUCH_ANIMATION_DURATION
: DividerView.TOUCH_RELEASE_ANIMATION_DURATION);
mAnimator.setInterpolator(touching
? Interpolators.TOUCH_RESPONSE
: Interpolators.FAST_OUT_SLOW_IN);
mAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mAnimator = null;
}
});
mAnimator.start();
}
@Override
protected void onDraw(Canvas canvas) {
int left = getWidth() / 2 - mCurrentWidth / 2;
int top = getHeight() / 2 - mCurrentHeight / 2;
int radius = Math.min(mCurrentWidth, mCurrentHeight) / 2;
canvas.drawRoundRect(left, top, left + mCurrentWidth, top + mCurrentHeight,
radius, radius, mPaint);
}
@Override
public boolean hasOverlappingRendering() {
return false;
}
}