Skip to content

Most visited

Recently visited

navigation
Notifications / Wearable / src / com.example.android.support.wearable.notifications /

AnimatedNotificationDisplayActivity.java

1
/*
2
 * Copyright (C) 2014 The Android Open Source Project
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 *      http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
 
17
package com.example.android.support.wearable.notifications;
18
 
19
import android.animation.Animator;
20
import android.animation.AnimatorListenerAdapter;
21
import android.animation.ObjectAnimator;
22
import android.animation.PropertyValuesHolder;
23
import android.app.Activity;
24
import android.content.Context;
25
import android.os.Bundle;
26
import android.view.ViewGroup;
27
import android.view.animation.AccelerateDecelerateInterpolator;
28
import android.widget.FrameLayout;
29
import android.widget.ImageView;
30
import android.widget.TextView;
31
 
32
import java.util.Random;
33
 
34
/**
35
 * Custom display activity for an animated sample notification.
36
 */
37
public class AnimatedNotificationDisplayActivity extends Activity {
38
    public static final String EXTRA_TITLE = "title";
39
 
40
    private static final int BASE_ANIMATION_DURATION_MS = 2000;
41
 
42
    private Random mRandom;
43
    private int mAnimationRange;
44
    private ImageView mImageView;
45
    private Animator mAnimation;
46
 
47
    @Override
48
    protected void onCreate(Bundle savedInstanceState) {
49
        super.onCreate(savedInstanceState);
50
        setContentView(R.layout.activity_animated_notification_display);
51
 
52
        mRandom = new Random(System.currentTimeMillis());
53
        mAnimationRange = getResources().getDimensionPixelSize(R.dimen.animation_range);
54
 
55
        String title = getIntent().getStringExtra(EXTRA_TITLE);
56
        ((TextView) findViewById(R.id.title)).setText(title);
57
 
58
        mImageView = new ImageView(this);
59
        mImageView.setImageResource(R.drawable.example_big_picture);
60
 
61
        ImageZoomView zoomView = new ImageZoomView(this, mImageView, mAnimationRange);
62
        zoomView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
63
                ViewGroup.LayoutParams.MATCH_PARENT));
64
 
65
        ((FrameLayout) findViewById(R.id.container)).addView(zoomView, 0);
66
 
67
        createNextAnimation(false);
68
    }
69
 
70
    private void createNextAnimation(boolean start) {
71
        float startX = mImageView.getTranslationX();
72
        float startY = mImageView.getTranslationY();
73
        float endX = -mRandom.nextInt(mAnimationRange);
74
        float endY = -mRandom.nextInt(mAnimationRange);
75
        float distance = (float) Math.sqrt(Math.pow(endX - startX, 2) + Math.pow(endY - startY, 2));
76
 
77
        mAnimation = ObjectAnimator.ofPropertyValuesHolder(mImageView,
78
                PropertyValuesHolder.ofFloat("translationX", startX, endX),
79
                PropertyValuesHolder.ofFloat("translationY", startY, endY));
80
        mAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
81
 
82
        mAnimation.setDuration(Math.max(BASE_ANIMATION_DURATION_MS / 10,
83
                (int) (distance * BASE_ANIMATION_DURATION_MS / mAnimationRange)));
84
 
85
        mAnimation.addListener(new AnimatorListenerAdapter() {
86
            @Override
87
            public void onAnimationEnd(Animator animation) {
88
                super.onAnimationEnd(animation);
89
                createNextAnimation(true);
90
            }
91
        });
92
        if (start) {
93
            mAnimation.start();
94
        }
95
    }
96
 
97
    @Override
98
    protected void onResume() {
99
        super.onResume();
100
        mAnimation.start();
101
    }
102
 
103
    @Override
104
    protected void onPause() {
105
        mAnimation.pause();
106
        super.onPause();
107
    }
108
 
109
    /** Helper view that zooms in on a child image view */
110
    private static class ImageZoomView extends ViewGroup {
111
        private final int mZoomLength;
112
 
113
        public ImageZoomView(Context context, ImageView imageView, int zoomLength) {
114
            super(context);
115
            addView(imageView);
116
            mZoomLength = zoomLength;
117
        }
118
 
119
        @Override
120
        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
121
            ImageView imageView = (ImageView) getChildAt(0);
122
 
123
            // Resize the image view to be at least mZoomLength pixels larger in both
124
            // dimensions than the containing view.
125
            int imageWidth = imageView.getDrawable().getIntrinsicWidth();
126
            int imageHeight = imageView.getDrawable().getIntrinsicHeight();
127
            int minSize = Math.max(right - left, bottom - top) + mZoomLength;
128
            if (imageWidth > imageHeight) {
129
                imageWidth = minSize * imageWidth / imageHeight;
130
                imageHeight = minSize;
131
            } else {
132
                imageHeight = minSize * imageHeight / imageWidth;
133
                imageWidth = minSize;
134
            }
135
            imageView.layout(left, top, left + imageWidth, top + imageHeight);
136
        }
137
    }
138
}
This site uses cookies to store your preferences for site-specific language and display options.

Hooray!

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.