在android中绘制和动画

时间:2010-11-05 22:21:08

标签: android graphics animation

首先,这是一个关于动画的问题,而不是特定的问题编码问题。我需要填写我一直在做的研究留下的广泛笔触。

我正在尝试做什么:

活动应该加载只有一个togglebutton可见。当触摸按钮时,png将被动画到相对于togglebutton的某个位置。此外,如果/当再次按下togglebutton时,另一个按钮将从屏幕外滑入并滑出。

我无法弄清楚:

我可以绘制图像,但只能通过xml绘制。创建一个imageview并以编程方式设置背景不会做任何事情。

当我从xml中绘制时,当按下togglebutton时我无法移动图像。当我调用getPositionOnScreen()时,我得到一个空指针,即使编译器可以看到我指的是xml和代码中描述的imageview。

我正在调用getPositionOnScreen,因为通过xml,我将图像放在togglebutton后面,这样在按下按钮并且图像开始移动之前它就不可见了。我的想法是,对于不同的屏幕尺寸,我不会确切地知道视图在运行时的位置。 getPostionOnScreen允许我获取imageview的坐标,所以我知道它的位置。当我有一个开始位置时,可以告诉它在togglebutton后面的“向上移动”,只需添加到x或y,直到它到达我想要的位置。

这是绘制图像的代码(插入onCreate方法)。

image= (ImageView) new ImageView(this);
  image.setImageResource(R.drawable.pic); 

这是我用来制作动画的代码。单击该按钮时,它会在侦听器的视图上调用此方法。

private void activate(){

  int loc[] = new int [2];
  image.getLocationOnScreen(loc);
  int fromXDelta = loc[0];
     int fromYDelta = loc[1];
  int toYDelta = fromYDelta;
     int toXDelta = fromXDelta - 30;

  TranslateAnimation translateAnimation = new TranslateAnimation
  (-fromXDelta, -toXDelta, -fromYDelta, -toYDelta);
     translateAnimation.setDuration(500);
     translateAnimation.setFillEnabled(true);

     image.startAnimation(translateAnimation);

 }

我很清楚这是非常错误的,不会奏效。我需要了解的是为什么。任何帮助都会非常受欢迎。

1 个答案:

答案 0 :(得分:1)

好的第一点。如果您使用ImageView创建新的new对象,则无需将其强制转换为“ImageView manually as it already is a fresh'n new ImageView”。

现在让你理解为什么在你最初厌倦的方式(即通过创建一个新对象)声明你的ImageView时没有显示,因为你很可能在你的setContentView()方法参数中onCreate()方法设置为R.layout.main(包含布局的main.xml文件)。现在这根本不起作用,因为Android不会知道你要创建的ImageView是什么,因为你从来没有使用它。 Yo可以通过代码在Java中定义ViewGroup(LinearLayout,AbsoluteLayout等)并将所有小部件(ImageView,ToggleButton等)分配给它们,然后将其设置为setContentView()的参数要显示它们,或者您可以更轻松地在XML文件中定义您需要的所有内容,就像我一样。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ToggleButton
        android:id="@+id/trigger"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOn="Active"
        android:textOff="Stopped"
        android:checked="false"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"/>
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/trigger"
        android:visibility="invisible"/>
</RelativeLayout>

现在使用Java,您只需要正确获取小部件的引用(或指针),这样就可以将它们用于各种令人讨厌的东西,例如为它们制作动画。

这是我的Java代码。

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class VeryCoolAnimation extends Activity {

    ImageView image = null;
    ToggleButton trigger = null;
    Context ctx = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ctx = getApplicationContext();

        trigger = (ToggleButton) findViewById(R.id.trigger);
        image = (ImageView) findViewById(R.id.image);

        image.setImageResource(R.drawable.icon);

        trigger.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if(isChecked) {
                    animate();
                }
            }
        });
    }

    private void animate() {
        int loc[] = new int[2];
        image.getLocationOnScreen(loc);
        // Just used to print out the images position
        Toast.makeText(ctx, "Position on screen: x = " + loc[0] + " y = " + loc[1], 5000).show();
        int fromXDelta = loc[0];
        int fromYDelta = loc[1];
            int toYDelta = fromYDelta + 50;
        int toXDelta = fromXDelta + 80;

        TranslateAnimation translateAnimation = new TranslateAnimation(
                fromXDelta, toXDelta, fromYDelta, toYDelta);
        translateAnimation.setDuration(800);
        translateAnimation.setFillEnabled(true);

        image.startAnimation(translateAnimation);
        image.setVisibility(View.INVISIBLE);
    }
}

我不完全确定这是你的目标效果,但你可以调整它以满足你的需求,因为你有一个功能齐全的代码。

祝你好运。