我有下一个移动360度图像的代码,但是当我触摸屏幕时,我想在一定程度上移动图像。例如,当触摸屏幕时,图像以近似或逆向方向移动10度。 请帮助我,我被困在一个项目。 我想要这样的东西。 In this image you can see how i want to implement.
提前致谢。
MainActivity.java
public class Tablero extends Activity {
private ImageView imagen;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tablero);
tv = (TextView) findViewById(R.id.tableroTv);
imagen = (ImageView) findViewById(R.id.tableroAnimacion);
imagen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int numero = (int)(Math.random()*6)+1;
Animation anim = new Animacion(getApplicationContext(),
imagen, 300);
anim.setDuration(3000);
imagen.startAnimation(anim);
tv.setText(numero+"");
}
});
}
}
Animation.java
public class Animacion extends Animation {
private View view;
private float cx, cy;
private float prevX, prevY;
private float r;
private Context context;
private float angulo;
private int cont=0;
public Animacion(Context context, View view, float r) {
this.context = context;
this.view = view;
this.r = r;
angulo = 90f;
}
@Override
public boolean willChangeBounds() {
return true;
}
@Override
public void initialize(int width, int height, int parentWidth,
int parentHeight) {
int cxImage = width / 2;
int cyImage = height / 2;
cx = view.getLeft() + cxImage;
cy = view.getTop() + cyImage;
prevX = cx;
prevY = cy;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if (interpolatedTime == 0) {
return;
}
//float angleDeg = (interpolatedTime * 360f + 90) % 360;
float angleDeg = (interpolatedTime * 60f + 90) % 360;
// float angleDeg = angulo;
float angleRad = (float) Math.toRadians(angleDeg);
//Log.d("animacion", "grados " + angleDeg);
//Log.d("animacion", "radianes " + angleRad);
float x = (float) (cx + r * Math.cos(angleRad));
float y = (float) (cy + r * Math.sin(angleRad));
float dx = prevX - x;
float dy = prevY - y;
Log.d("animacion", "x: " + x + " y : " + y
+" dx: " + dx + " dy: " +dy);
t.getMatrix().setTranslate(dx, dy);
}
public void setAngulo(float grados){
this.angulo = grados;
}
public float getAngulo(){
return this.angulo;
}
}
答案 0 :(得分:0)
您的第一步是检测触摸输入并决定如何处理它。看看这个:OnTouchListener in a View - Android
基本上,您希望使Activity实现OnTouchListener接口,并提供onTouch(View v,MotionEvent事件)方法的重写版本。在这里,您可以提取事件操作并根据需要进行处理。
这也有助于:http://developer.android.com/reference/android/view/MotionEvent.html
当用户将手指放在屏幕上时,会发生ACTION_DOWN事件。当用户触摸屏幕并移动手指而不将其从屏幕上抬起时,会发生ACTION_MOVE事件。 ACTION_UP是指用户将手指从屏幕上移开。我指出所有这一切的原因是,如果你想要在用户手指向下并且不移动它时发生某些事情,你必须将一些变量设置为true,例如当ACTION_DOWN发生时,并且当ACTION_UP时为false发生。所以当变量为真时,旋转会一直发生,一次10度。另一种方法当然是在ACTION_DOWN上进行一次旋转,然后在用户移动手指时在ACTION_MOVE上重复。您还可以在MotionEvent变量上调用.getX()和.getY(),它可以让您知道用户触摸的位置,并可能确定他们移动手指的方向等。