首先,这是一个关于动画的问题,而不是特定的问题编码问题。我需要填写我一直在做的研究留下的广泛笔触。
我正在尝试做什么:
活动应该加载只有一个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);
}
我很清楚这是非常错误的,不会奏效。我需要了解的是为什么。任何帮助都会非常受欢迎。
答案 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);
}
}
我不完全确定这是你的目标效果,但你可以调整它以满足你的需求,因为你有一个功能齐全的代码。
祝你好运。