1c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler/* 2c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * Copyright (C) 2012 The Android Open Source Project 3c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * 4c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License"); 5c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * you may not use this file except in compliance with the License. 6c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * You may obtain a copy of the License at 7c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * 8c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * http://www.apache.org/licenses/LICENSE-2.0 9c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * 10c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * Unless required by applicable law or agreed to in writing, software 11c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS, 12c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * See the License for the specific language governing permissions and 14c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * limitations under the License. 15c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler */ 16c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 17c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerpackage com.android.dreams.bummer; 18c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 19c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.content.Context; 20c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.os.Handler; 21c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.os.Message; 22c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.util.AttributeSet; 23c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.view.View; 24c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.widget.TextView; 25c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 26c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerpublic class BummerView extends TextView { 27c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler public static final int START = 1; 28c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler public static final int MOVE = 2; 29c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 30c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler private int mDelay = 10000; // ms 31c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler private int mAnimTime = 2000; // ms 32c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler private boolean mAnimate = true; 33c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 34c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler private Handler mHandler = new Handler() { 35c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler @Override 36c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler public void handleMessage(Message m) { 37c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler boolean animate = false; 38c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler switch (m.what) { 39c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler case MOVE: 40c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler animate = mAnimate; 41c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler // fall through 42c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler case START: 43c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler final View parent = (View) BummerView.this.getParent(); 44c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler if (parent == null) 45c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler return; 46c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 47c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler final float framew = parent.getMeasuredWidth(); 48c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler final float frameh = parent.getMeasuredHeight(); 49c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler final float textw = getMeasuredWidth(); 50c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler final float texth = getMeasuredHeight(); 51c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 52c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler final float newx = (float) (Math.random() * (framew - textw)); 53c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler final float newy = (float) (Math.random() * (frameh - texth)); 54c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler if (animate) { 55c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler animate().x(newx) 56c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler .y(newy) 57c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler .setDuration(mAnimTime) 58c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler .start(); 59c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } else { 60c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler setX(newx); 61c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler setY(newy); 62c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } 63c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler setVisibility(View.VISIBLE); 64c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 65c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler removeMessages(MOVE); 66c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler sendEmptyMessageDelayed(MOVE, mDelay); 67c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler break; 68c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } 69c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } 70c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler }; 71c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 72c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler public BummerView(Context context) { 73c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler super(context); 74c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } 75c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 76c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler public BummerView(Context context, AttributeSet attrs) { 77c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler this(context, attrs, 0); 78c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } 79c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 80c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler public BummerView(Context context, AttributeSet attrs, int flags) { 81c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler super(context, attrs, flags); 82c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } 83c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 84c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler public void setAnimationParams(boolean animate, int delay, int animTime) { 85c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler mAnimate = animate; 86c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler mDelay = delay; 87c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler mAnimTime = animTime; 88c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } 89c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 90c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler @Override 91c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler public void onAttachedToWindow() { 92c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler final View parent = (View) this.getParent(); 93c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler parent.addOnLayoutChangeListener(new OnLayoutChangeListener() { 94c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler public void onLayoutChange(View v, int left, int top, int right, int bottom, 95c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler int oldLeft, int oldTop, int oldRight, int oldBottom) { 96c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler if (v == parent && right != oldRight) { 97c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler mHandler.removeMessages(MOVE); 98c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler mHandler.sendEmptyMessage(START); 99c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } 100c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } 101c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler }); 102c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 103c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler mHandler.sendEmptyMessage(START); 104c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler } 105c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler 106c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler} 107