blob: 2e0b2eed4ecc74c21bb0bf3f68e7b16b794f4980 [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.support.wearable.notifications;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Random;
/**
* Custom display activity for an animated sample notification.
*/
public class AnimatedNotificationDisplayActivity extends Activity {
public static final String EXTRA_TITLE = "title";
private static final int BASE_ANIMATION_DURATION_MS = 2000;
private Random mRandom;
private int mAnimationRange;
private ImageView mImageView;
private Animator mAnimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animated_notification_display);
mRandom = new Random(System.currentTimeMillis());
mAnimationRange = getResources().getDimensionPixelSize(R.dimen.animation_range);
String title = getIntent().getStringExtra(EXTRA_TITLE);
((TextView) findViewById(R.id.title)).setText(title);
mImageView = new ImageView(this);
mImageView.setImageResource(R.drawable.example_big_picture);
ImageZoomView zoomView = new ImageZoomView(this, mImageView, mAnimationRange);
zoomView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
((FrameLayout) findViewById(R.id.container)).addView(zoomView, 0);
createNextAnimation(false);
}
private void createNextAnimation(boolean start) {
float startX = mImageView.getTranslationX();
float startY = mImageView.getTranslationY();
float endX = -mRandom.nextInt(mAnimationRange);
float endY = -mRandom.nextInt(mAnimationRange);
float distance = (float) Math.sqrt(Math.pow(endX - startX, 2) + Math.pow(endY - startY, 2));
mAnimation = ObjectAnimator.ofPropertyValuesHolder(mImageView,
PropertyValuesHolder.ofFloat("translationX", startX, endX),
PropertyValuesHolder.ofFloat("translationY", startY, endY));
mAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
mAnimation.setDuration(Math.max(BASE_ANIMATION_DURATION_MS / 10,
(int) (distance * BASE_ANIMATION_DURATION_MS / mAnimationRange)));
mAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
createNextAnimation(true);
}
});
if (start) {
mAnimation.start();
}
}
@Override
protected void onResume() {
super.onResume();
mAnimation.start();
}
@Override
protected void onPause() {
mAnimation.pause();
super.onPause();
}
/** Helper view that zooms in on a child image view */
private static class ImageZoomView extends ViewGroup {
private final int mZoomLength;
public ImageZoomView(Context context, ImageView imageView, int zoomLength) {
super(context);
addView(imageView);
mZoomLength = zoomLength;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
ImageView imageView = (ImageView) getChildAt(0);
// Resize the image view to be at least mZoomLength pixels larger in both
// dimensions than the containing view.
int imageWidth = imageView.getDrawable().getIntrinsicWidth();
int imageHeight = imageView.getDrawable().getIntrinsicHeight();
int minSize = Math.max(right - left, bottom - top) + mZoomLength;
if (imageWidth > imageHeight) {
imageWidth = minSize * imageWidth / imageHeight;
imageHeight = minSize;
} else {
imageHeight = minSize * imageHeight / imageWidth;
imageWidth = minSize;
}
imageView.layout(left, top, left + imageWidth, top + imageHeight);
}
}
}