/* * 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); } } }