web-dev-qa-db-fra.com

Comment créer un contrôle de roue rotative?

J'essaie de mettre en œuvre la molette Rotatory dans Android, tout comme l'image ci-dessous.J'ai trouvé le didacticiel de ce lien . Mais je veux mettre en œuvre juste comme indiqué dans l'image ci-dessous.La roue se compose d'images individuelles. N'importe qui ont une idée de cette implémentation? Toute aide serait appréciée.

enter image description here

Merci d'avance.

Akash

21
AkashG

Appliqué sur OnTouchListener sur l'imageView à travers lequel j'ai eu trois événements à savoir: 

  1. MotionEvent.ACTION_DOWN
  2. MotionEvent.ACTION_MOVE
  3. MotionEvent.ACTION_UP .

Sur MotionEvent.ACTION_DOWN a l'angle sous lequel les utilisateurs se touchent et sur MotionEvent.ACTION_UP a l'angle sous lequel l'utilisateur relâche.

Après avoir obtenu la différence des deux angles, fait pivoter l'image de cet angle.

Après avoir fait pivoter l’image, le quadrant vérifiait l'angle et le maintien de la variable int incrémentée en fonction du quadrant et remplissant la condition définie pour la nouvelle image (celle souhaitée).

Maintien de l'événement click en fonction de la valeur de la variable int.

2
AkashG

Pour faire cela à partir de zéro, vous auriez besoin d’un moyen de transformer vos coordonnées tactiles en coordonnées polaires (pour avoir l’angle de rotation). Cela peut être fait facilement comme ceci:

private float cartesianToPolar(float x, float y) {
  return (float) -Math.toDegrees(Math.atan2(x - 0.5f, y - 0.5f));
}

Pour faire pivoter l'image view, ou l'élément que vous utilisez pour afficher votre bouton, vous pouvez utiliser une matrice comme celle-ci:

Matrix matrix=new Matrix();
ivRotor.setScaleType(ScaleType.MATRIX);   
matrix.postRotate((float) deg, m_nWidth/2, m_nHeight/2);//getWidth()/2, getHeight()/2);
ivRotor.setImageMatrix(matrix);

Où deg est l'angle et ivRobor est le bouton imageview.

Un exemple complet de travail pour Android est disponible sur le code Google à l'adresse suivante: https://code.google.com/p/Android-rotaryknob-view/

2
radhoo

Voici le code complet pour cela:

import Android.animation.ObjectAnimator;
import Android.app.Activity;
import Android.graphics.Bitmap;
import Android.graphics.BitmapFactory;
import Android.graphics.Color;
import Android.graphics.drawable.ColorDrawable;
import Android.os.Bundle;
import Android.graphics.Matrix;
import Android.view.View;
import Android.view.animation.Animation;
import Android.view.animation.LinearInterpolator;
import Android.view.animation.RotateAnimation;
import Android.widget.Button;
import Android.widget.ImageView;
import Android.widget.Toast;

import Java.util.Random;

public class MainActivity extends Activity{
//  Button rotate;
ImageView i;
ImageView ii;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    i= (ImageView) findViewById(R.id.i);
    i.setImageResource(R.drawable.gg);
    ii= (ImageView) findViewById(R.id.ii);
    ii.setImageResource(R.drawable.gg);

    // i.setBackgroundColor(Color.rgb(255, 255, 255));
}

public void ii(View v)
{

    RotateAnimation rotate =
            //new RotateAnimation(0f,generateRandomNumber(),55f,55f);
            new RotateAnimation(0, generateRandomNumber(), 
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

    rotate.setDuration(1500);
    rotate.setInterpolator(new LinearInterpolator());
    i.startAnimation(rotate);
    i.setRotation(generateRandomNumber());
    RotateAnimation rotate1 =
            //new RotateAnimation(0f,generateRandomNumber(),55f,55f);
            new RotateAnimation(0, 999999999, Animation.RELATIVE_TO_SELF, 
 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    rotate1.setDuration(99999);

    rotate1.setInterpolator(new LinearInterpolator());
    // i= (ImageView) findViewById(R.id.i);
    //     i.setImageResource(R.drawable.g);

    ii.startAnimation(rotate1);

/*i= (ImageView) findViewById(R.id.i);
    i.setImageResource(R.drawable.g);
    ObjectAnimator animator = ObjectAnimator.ofFloat(i,"rotationY", 360f);
    animator.setDuration(1000);
    animator.start();
 */

   /* Matrix matrix = new Matrix();
   i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);   //required
    matrix.postRotate(generateRandomNumber());
  i.setImageMatrix(matrix);
 */




   /* Matrix matrix = new Matrix();
    Bitmap bMap = BitmapFactory.decodeResource(getResources(), 
 R.drawable.g);
   matrix.postRotate(generateRandomNumber());

    Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 
 0,bMap.getWidth(),bMap.getHeight(), matrix, true);
    i.setImageBitmap(bMapRotate);*/
}


public float generateRandomNumber() {

    Random Rand = new Random();
    int randomNum = Rand.nextInt((10000000 - 125000) + 1);

    return (float)randomNum;
}



int backpressed=0;
@Override
public void onBackPressed() {
    backpressed++;
    if(backpressed>1)
    {
        super.onBackPressed();
        finish();
    }
    else
    {
        Toast.makeText(this, "Press back again to exit", 
  Toast.LENGTH_LONG).show();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    Thread.sleep(2000);}
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                backpressed=0;
            }
        });
    }
}
}

Voici le XML:

tools:context=".MainActivity">
<TextView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text=".............."
    Android:textColor="#00ff10"
    Android:textStyle="bold"
    Android:textSize="25dp"
    Android:layout_gravity="center"/>
<ImageView
    Android:layout_width="200dp"
    Android:layout_height="80dp"
    Android:layout_gravity="center"
    Android:src="@drawable/a"

    />
<ImageView
    Android:layout_width="300dp"
    Android:layout_height="300dp"
    Android:layout_gravity="center"
    Android:id="@+id/i"

    />
<DigitalClock
    Android:layout_width="100dp"
    Android:layout_height="50dp"
    Android:layout_gravity="center"/>
<Button
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="Play"
    Android:backgroundTint="#ff0044"
    Android:id="@+id/rotate"
    Android:layout_gravity="center"
    Android:onClick="ii"/>
<TextView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="powered by ashwani"
    Android:textColor="#00ff10"
    Android:textStyle="bold"
    Android:layout_gravity="center"/>
<ImageView
    Android:layout_width="50dp"
    Android:layout_height="50dp"
    Android:layout_gravity="center"
    Android:id="@+id/ii"

    />

0
Ashwani