最近,我一直在玩动画并试图类似.这是班级.它基本上围绕父视图反弹(你可以改变数学进一步)

package com.example.animationtests.view;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.Drawable;

import android.util.AttributeSet;

import android.view.View;

import android.widget.ImageView;

public class BouncingImageView extends ImageView {

private View mParent;

public BouncingImageView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

public BouncingImageView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public BouncingImageView(Context context) {

super(context);

}

@Override

protected void onAttachedToWindow() {

super.onAttachedToWindow();

mParent = (View) getParent();

getHandler().post(mRunnable);

}

@Override

protected void onDetachedFromWindow() {

getHandler().removeCallbacks(mRunnable);

super.onDetachedFromWindow();

}

private final Runnable mRunnable = new Runnable() {

private static final int DIRECTION_POSITIVE = 1;

private static final int DIRECTION_NEGATIVE = -1;

private static final int ANIMATION_STEPS = 1;

private int mHorizontalDirection = DIRECTION_POSITIVE;

private int mVerticalDirection = DIRECTION_NEGATIVE;

public boolean mStarted = false;

@Override

public void run() {

if (mParent == null) {

return;

}

final float width = getMeasuredWidth();

final float height = getMeasuredHeight();

final float parentWidth = mParent.getMeasuredWidth();

final float parentHeight = mParent.getMeasuredHeight();

float x = getX();

float y = getY();

if (!mStarted) {

/***

* Randomize initial position

*/

x = (float) Math.random() * (parentWidth - width);

y = (float) Math.random() * (parentHeight - height);

mHorizontalDirection = ((int) x % 2 == 0) ? DIRECTION_NEGATIVE : DIRECTION_POSITIVE;

mVerticalDirection = ((int) y % 2 == 0) ? DIRECTION_NEGATIVE : DIRECTION_POSITIVE;

mStarted = true;

} else {

if (mHorizontalDirection == DIRECTION_NEGATIVE) {

x -= ANIMATION_STEPS;

} else {

x += ANIMATION_STEPS;

}

if (mVerticalDirection == DIRECTION_NEGATIVE) {

y -= ANIMATION_STEPS;

} else {

y += ANIMATION_STEPS;

}

if (x - (width / 3) < 0) {

mHorizontalDirection = DIRECTION_POSITIVE;

} else if (x + (width / 3) > (parentWidth - width)) {

mHorizontalDirection = DIRECTION_NEGATIVE;

}

if (y - (height / 3) < 0) {

mVerticalDirection = DIRECTION_POSITIVE;

} else if (y + (width / 3) > (parentHeight - height)) {

mVerticalDirection = DIRECTION_NEGATIVE;

}

}

setX(x);

setY(y);

getHandler().post(this);

}

};

}

用法:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".BouncingCircles" >

android:layout_width="match_parent"

android:layout_height="300dp"

android:layout_alignParentBottom="true" >

android:layout_width="50dp"

android:layout_height="50dp"

android:src="@drawable/light_dino" />

android:layout_width="40dp"

android:layout_height="40dp"

android:src="@drawable/light_dino" />

android:layout_width="70dp"

android:layout_height="70dp"

android:src="@drawable/light_dino" />

android:layout_width="90dp"

android:layout_height="90dp"

android:src="@drawable/light_dino" />

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐