Android动画顺时针

时间:2014-05-30 14:39:49

标签: java android animation

我有下一个移动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;
    }
}

1 个答案:

答案 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(),它可以让您知道用户触摸的位置,并可能确定他们移动手指的方向等。