gpt4 book ai didi

android - 在android中以圆形路径移动图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:19:41 24 4
gpt4 key购买 nike

我有一个图像,我想在循环路径中移动它 onClick() 没有动画的按钮事件,

我不知道该怎么做..有什么帮助吗??


这是我的主课

public class MainActivity extends Activity {
MyAnimation animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
animation =new MyAnimation ();

}

我正在使用您提供的代码作为

public class MyAnimation extends Animation {
float cx,cy,prevX,prevY,r;

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);

float angle = (float) (interpolatedTime * 2 * Math.PI);
// r = radius, cx and cy = center point, a = angle (radians)
float x = (float) (cx + r * Math.cos(angle)) ;
float y = (float) (cy + r * Math.sin(angle));

float dx = prevX - x;
float dy = prevY - y;

prevX = x;
prevY = y;

t.getMatrix().setTranslate(dx, dy);
}

这是我想要以圆形移动的图像的 xml。

<ImageView
android:id="@+id/myanimation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/ic_launcher" />

最佳答案

我认为您在这里有两个选择:创建自定义动画,或者创建您的 ImageView,然后使用表面自己沿着路径绘制它。

第一个选项更容易,并且可能会给出更好的结果,因为在动画类中,时间是用 Interpolators 为您处理的(线性时间、快速开始、正常结束等)。我强烈建议您编写自定义动画,因为我不明白您为什么不想使用 Animation 类(动画图像正是您想要的)。

编辑:我花了一些时间并实现了以下内容。它并非一尘不染,但确实以圆形路径为图像设置动画。

Activity :

public class MainActivity extends Activity {

private ImageView image;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.image);

image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Animation anim = new MyAnimation(image, 100);
anim.setDuration(3000);
image.startAnimation(anim);
}
});
}

}

动画类:

public class MyAnimation extends Animation {

private View view;
private float cx, cy; // center x,y position of circular path
private float prevX, prevY; // previous x,y position of image during animation
private float r; // radius of circle
private float prevDx, prevDy;


/**
* @param view - View that will be animated
* @param r - radius of circular path
*/
public MyAnimation(View view, float r){
this.view = view;
this.r = r;
}

@Override
public boolean willChangeBounds() {
return true;
}

@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
// calculate position of image center
int cxImage = width / 2;
int cyImage = height / 2;
cx = view.getLeft() + cxImage;
cy = view.getTop() + cyImage;

// set previous position to center
prevX = cx;
prevY = cy;
}

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if(interpolatedTime == 0){
t.getMatrix().setTranslate(prevDx, prevDy);
return;
}

float angleDeg = (interpolatedTime * 360f + 90) % 360;
float angleRad = (float) Math.toRadians(angleDeg);

// r = radius, cx and cy = center point, a = angle (radians)
float x = (float) (cx + r * Math.cos(angleRad));
float y = (float) (cy + r * Math.sin(angleRad));


float dx = prevX - x;
float dy = prevY - y;

prevX = x;
prevY = y;

prevDx = dx;
prevDy = dy;


t.getMatrix().setTranslate(dx, dy);
}
}

XML 布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/ic_launcher" />

</RelativeLayout>

您可能需要在这里和那里调整它以获得您想要的东西,但这可以作为实现它的基础。

关于android - 在android中以圆形路径移动图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20281265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com