[JAVA] [Android] Essayez celui qui affiche l'effet sur la partie touchée de l'écran qui est courant dans les jeux

Comme le titre l'indique, lorsque vous touchez l'écran, il brille et des marques apparaissent. Je voulais faire ça, alors j'ai noté ce que j'ai regardé.

À propos, la version iOS est ici * Objective-c

Android semble utiliser onTouchEvent.

Tout d'abord, créez une classe java qui hérite de la classe Activity et implémentez onTouchEvent.

public class TapActivity extends Activity {
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tap);
    }

 @Override
    public boolean onTouchEvent(MotionEvent event) {
        float pointX = event.getX();
        float pointY = event.getY();

        return super.onTouchEvent(event);
    }
}

Désormais, pointX et pointY contiendront les coordonnées X et Y du point de contact. Après cela, si vous le faites bien avec ça.

Par exemple ...

1.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout

    android:id="@+id/tapLayout"← Donnez votre identifiant

    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="jp.***.***.***.***.TapActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

</RelativeLayout>

2.TapActivity.java

public class TapActivity extends Activity {

//Définir ViewGroup
    RelativeLayout tapLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//Remplacez RelativeLayout par l'ID donné en xml au ViewGroup défini
     tapLayout = (RelativeLayout)findViewById(R.id.tapLayout)
    }

@Override
    public boolean onTouchEvent(MotionEvent event) {
        float pointX = event.getX();
        float pointY = event.getY();

//Obtenez l'écran dp et préparez la taille de l'image
        float dp = getResources().getDisplayMetrics().density;
        int imgSize = (int)(50 * dp);

//Définir l'image
        ImageView img = new ImageView(getApplicationContext());
     img.setImageResource(R.drawable.Marquer l'image);

//Définir la taille de l'image dans ImageView
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(imgSize, imgSize);
        img.setLayoutParams(params);

//Réglez le point tactile pour qu'il se trouve au milieu de l'image
        img.setX(pointX-imgSize/2);
        img.setY(pointY-imgSize/2);
        img.setScaleType(ImageView.ScaleType.FIT_XY);

//Réduire l'image à la moitié de sa taille
        img.setScaleX(0.5f);
        img.setScaleY(0.5F);

//Dessiner une image
        tapLayout.addView(img);

//0.Animation qui devient transparente tout en augmentant à la taille d'origine en 3 secondes
        ViewCompat.animate(img)
                 .setDuration(300)
                 .alpha(0)
                 .scaleX(1)
                 .scaleY(1)
                 .setListener(new ViewPropertyAnimatorListener() {
                     @Override
                     public void onAnimationStart(View view) {

                     }

                     @Override
                     public void onAnimationEnd(View view) {
//Supprimé à la fin de l'animation
                         tapLayout.removeView(img);
                     }

                     @Override
                     public void onAnimationCancel(View view) {

                     }
                 }).start();
               

        return super.onTouchEvent(event);
    }

Mais avec cela, lorsque vous appuyez dessus, l'effet sort et ce n'est pas cool. .. .. De plus, même si vous bougez votre doigt tout en touchant l'écran, cela ne suit pas. De plus, si vous souhaitez mettre un effet sur l'écran, appuyez sur tout au long de l'application, vous ne pouvez pas le décrire dans toutes les activités, vous souhaitez donc implémenter chaque écran avec une activité qui en hérite.

Ce qui suit est l'accomplissement de toute telle cupidité.

1.TapActivity.java

public class TapActivity extends Activity {

//Définir ViewGroup
    ViewGroup viewGroup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

//Préparer une méthode pour recevoir ViewGroup
    public void setViewGroup(ViewGroup vg){
        viewGroup = vg;
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float pointX = event.getX();
        float pointY = event.getY();
        float dp = getResources().getDisplayMetrics().density;
        int imgSize = (int)(50 * dp);

//Action de branche avec instruction switch
        switch (event.getAction()){
//Lorsque vous appuyez sur l'écran
            case MotionEvent.ACTION_DOWN:

                break;

//Lorsque votre doigt est hors de l'écran
            case MotionEvent.ACTION_UP:
                final ImageView img = new ImageView(getApplicationContext());
                img.setImageResource(R.drawable.Marquer l'image);
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(imgSize, imgSize);
                img.setLayoutParams(params);

                img.setX(pointX-imgSize/2);
                img.setY(pointY-imgSize/2);
                img.setScaleType(ImageView.ScaleType.FIT_XY);
                img.setScaleX(0.5f);
                img.setScaleY(0.5F);
                viewGroup.addView(img);
                ViewCompat.animate(img)
                        .setDuration(300)
                        .alpha(0)
                        .scaleX(1)
                        .scaleY(1)
                        .setListener(new ViewPropertyAnimatorListener() {
                            @Override
                            public void onAnimationStart(View view) {

                            }

                            @Override
                            public void onAnimationEnd(View view) {
                                viewGroup.removeView(img);
                            }

                            @Override
                            public void onAnimationCancel(View view) {

                            }
                        }).start();
                break;

//Lorsque vous bougez votre doigt tout en touchant l'écran
            case MotionEvent.ACTION_MOVE:
                final ImageView img2 = new ImageView(getApplicationContext());
                img2.setImageResource(R.drawable.Marquer l'image);
                LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(imgSize, imgSize);
                img2.setLayoutParams(params2);

                img2.setX(pointX-imgSize/2);
                img2.setY(pointY-imgSize/2);
                img2.setScaleType(ImageView.ScaleType.FIT_XY);

                viewGroup.addView(img2);

//0.Animation qui devient transparente en se rétrécissant en 3 secondes
                ViewCompat.animate(img2)
                        .setDuration(300)
                        .alpha(0)
                        .scaleX(0.01f)
                        .scaleY(0.01f)
                        .setListener(new ViewPropertyAnimatorListener() {
                            @Override
                            public void onAnimationStart(View view) {

                            }

                            @Override
                            public void onAnimationEnd(View view) {
                                viewGroup.removeView(img2);
                            }

                            @Override
                            public void onAnimationCancel(View view) {

                            }
                        }).start();
                break;
        }


        return super.onTouchEvent(event);
    }
}

2.MainActivity.java

//Hériter de TapActivity
public class MainActivity extends TapActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   
//Passer ViewGroup avec l'ID donné dans le fichier xml
       setViewGroup((RelativeLayout)findViewById(R.id.mainLayout));
    }

}

Vous pouvez maintenant appuyer et vous déplacer pour suivre, et même si vous en héritez, cela fonctionnera. À propos, il ne semble y avoir aucun moyen d'obtenir le ViewGroup actuellement affiché sur Android, il était donc assez difficile d'en hériter et de dessiner l'effet. En fin de compte, j'ai pris la méthode non cool de faire passer l'appelant sur onCreate à chaque fois. .. ..

Si quelqu'un connaît un autre bon moyen, donnez-moi s'il vous plaît quelques conseils!

Recommended Posts

[Android] Essayez celui qui affiche l'effet sur la partie touchée de l'écran qui est courant dans les jeux
Afficher la liste en setDétails à l'écran avec ressort-sécurité
Changer la signature de build de débogage de l'application Android en signature de version est utile à bien des égards.
Comment implémenter l'affichage sur une seule ligne de TextView dans le développement Android
Comment afficher 0 sur le côté gauche de la valeur d'entrée standard
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Changez la conversation en fonction du jour d'aujourd'hui
Essai et erreur pour afficher les jours fériés dans le développement d'applications Android. Partie 2
Code de la partie où server.servlet.session.timeout est défini dans spring.session.timeout dans le système spring-boot2
[Développement d'applications Android] Comment afficher en plein écran (barre de notification masquée)
Qu'est-ce qui n'était pas une utilisation équitable du détournement d'API Java sur Android?
Essai et erreur pour afficher les jours fériés dans le développement d'applications Android. Partie 1
Développement Android, comment vérifier null dans la valeur de l'objet JSON
Est-il possible de mettre la bibliothèque (aar) dans la bibliothèque Android (aar) et de l'utiliser?
Modifiez la destination d'enregistrement de l'image en S3 dans l'application Rails. Partie 2
[Introduction à l'informatique Partie 1: Essayons l'apprentissage automatique] Implémentons la méthode de calcul de la moyenne k en Java - À propos du concept de coordonnées -
Afficher le texte en haut de l'image
Essayez d'utiliser le service sur Android Oreo
Exemple d'affichage des notifications (tête haute) sur Android
Comment le site Web s'affiche à l'écran
Pré-traitement à afficher sur le navigateur (compilateur)
[Ruby on Rails] Comment faire de la destination du lien une partie de l'ID spécifié
Résumer le cycle de vie des objets Java à prendre en compte dans le développement Android
Dans spring-security, l'URL de redirection de mon écran de connexion est incorrecte et la connexion échoue.
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?
Est-il courant de ne pas écrire la balise de fermeture de la balise <P> dans Javadoc?
Correspondance de la partie où l'authentification # getDetails est effectuée dans le test unitaire de spring-security