[JAVA] [Android] Probieren Sie den aus, der den in Spielen üblichen Effekt auf dem berührten Teil des Bildschirms anzeigt

Wie der Titel schon sagt, wenn Sie den Bildschirm berühren, glitzert er und Markierungen erscheinen. Ich wollte das tun, also habe ich mir notiert, was ich nachgeschlagen habe.

Die iOS-Version ist übrigens hier * Objective-c

Android scheint onTouchEvent zu verwenden.

Erstellen Sie zunächst eine Java-Klasse, die die Activity-Klasse erbt, und implementieren Sie 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);
    }
}

Jetzt enthalten pointX und pointY die X- und Y-Koordinaten des Berührungspunkts. Danach, wenn Sie es gut damit machen.

Zum Beispiel ...

1.activity_main.xml

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

    android:id="@+id/tapLayout"← ID geben

    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 {

//Definieren Sie ViewGroup
    RelativeLayout tapLayout;

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

//Ersetzen Sie RelativeLayout durch die in XML angegebene ID für die definierte ViewGroup
     tapLayout = (RelativeLayout)findViewById(R.id.tapLayout)
    }

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

//Holen Sie sich Bildschirm-DP und bereiten Sie die Bildgröße vor
        float dp = getResources().getDisplayMetrics().density;
        int imgSize = (int)(50 * dp);

//Bild einstellen
        ImageView img = new ImageView(getApplicationContext());
     img.setImageResource(R.drawable.Bild markieren);

//Stellen Sie die Bildgröße in ImageView ein
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(imgSize, imgSize);
        img.setLayoutParams(params);

//Stellen Sie den Berührungspunkt so ein, dass er sich in der Mitte des Bildes befindet
        img.setX(pointX-imgSize/2);
        img.setY(pointY-imgSize/2);
        img.setScaleType(ImageView.ScaleType.FIT_XY);

//Bild auf halbe Größe reduzieren
        img.setScaleX(0.5f);
        img.setScaleY(0.5F);

//Zeichne ein Bild
        tapLayout.addView(img);

//0.Animation, die transparent wird, während sie über 3 Sekunden auf die ursprüngliche Größe erweitert wird
        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) {
//Am Ende der Animation gelöscht
                         tapLayout.removeView(img);
                     }

                     @Override
                     public void onAnimationCancel(View view) {

                     }
                 }).start();
               

        return super.onTouchEvent(event);
    }

Aber wenn Sie darauf tippen, kommt der Effekt heraus und es ist nicht cool. .. .. Selbst wenn Sie Ihren Finger bewegen, während Sie auf den Bildschirm tippen, folgt dies nicht. Wenn Sie in der gesamten Anwendung einen Effekt auf den Bildschirm ausüben möchten, können Sie dies nicht in allen Aktivitäten beschreiben. Daher möchten Sie jeden Bildschirm mit einer Aktivität implementieren, die dies erbt.

Das Folgende ist die Erfüllung all dieser Gier.

1.TapActivity.java

public class TapActivity extends Activity {

//Definieren Sie ViewGroup
    ViewGroup viewGroup;

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

//Bereiten Sie eine Methode zum Empfangen von ViewGroup vor
    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);

//Verzweigungsaktion mit switch-Anweisung
        switch (event.getAction()){
//Beim Tippen auf den Bildschirm
            case MotionEvent.ACTION_DOWN:

                break;

//Wenn Ihr Finger nicht auf dem Bildschirm ist
            case MotionEvent.ACTION_UP:
                final ImageView img = new ImageView(getApplicationContext());
                img.setImageResource(R.drawable.Bild markieren);
                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;

//Wenn Sie Ihren Finger bewegen, während Sie auf den Bildschirm tippen
            case MotionEvent.ACTION_MOVE:
                final ImageView img2 = new ImageView(getApplicationContext());
                img2.setImageResource(R.drawable.Bild markieren);
                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, die transparent wird, während sie über 3 Sekunden schrumpft
                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

//TapActivity erben
public class MainActivity extends TapActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   
//Übergeben Sie ViewGroup mit der in der XML-Datei angegebenen ID
       setViewGroup((RelativeLayout)findViewById(R.id.mainLayout));
    }

}

Jetzt können Sie tippen und sich bewegen, um zu folgen, und selbst wenn Sie es erben, wird es funktionieren. Übrigens scheint es keine Möglichkeit zu geben, die aktuell angezeigte ViewGroup auf Android zu erhalten, daher war es ziemlich schwierig, sie zu erben und den Effekt zu zeichnen. Am Ende habe ich die uncoole Methode gewählt, bei der der Anrufer sie jedes Mal an onCreate weiterleitet. .. ..

Wenn jemand einen anderen guten Weg kennt, gib mir bitte einen Rat!

Recommended Posts

[Android] Probieren Sie den aus, der den in Spielen üblichen Effekt auf dem berührten Teil des Bildschirms anzeigt
Zeigen Sie die Liste in setDetails mit Federsicherheit auf dem Bildschirm an
Das Ändern der Debug-Build-Signatur der Android-App in die Release-Signatur ist in vielerlei Hinsicht hilfreich.
So implementieren Sie eine einzeilige Anzeige von TextView in der Android-Entwicklung
So zeigen Sie 0 auf der linken Seite des Standardeingabewerts an
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
Ändern Sie das Gespräch je nachdem, welcher Tag heute ist
Versuch und Irrtum, um nationale Feiertage in der Android-App-Entwicklung anzuzeigen. Teil 2
Code des Teils, in dem server.servlet.session.timeout in spring.session.timeout im spring-boot2-System festgelegt ist
[Entwicklung von Android-Anwendungen] Anzeigen im Vollbildmodus (Benachrichtigungsleiste ausgeblendet)
Was war keine faire Verwendung der Java-API-Umleitung unter Android?
Versuch und Irrtum, um nationale Feiertage in der Android-App-Entwicklung anzuzeigen. Teil 1
Android-Entwicklung, wie man den Wert des JSON-Objekts auf null überprüft
Ist es möglich, die Bibliothek (aar) in die Android-Bibliothek (aar) zu stellen und zu verwenden?
Ändern Sie das Speicherziel des Bildes in der Rails-App in S3. Teil 2
[Einführung in die Informatik Teil 1: Versuchen wir es mit maschinellem Lernen] Implementieren wir die k-Mittelungsmethode in Java - Über das Konzept der Koordinaten -
Zeigen Sie Text über dem Bild an
Versuchen Sie, den Dienst auf Android Oreo zu verwenden
Beispiel für die Anzeige von (Head-up-) Benachrichtigungen auf Android
Wie die Website auf dem Bildschirm angezeigt wird
Vorverarbeitung zur Anzeige im Browser (Compiler)
[Ruby on Rails] So machen Sie das Linkziel zu einem Teil der angegebenen ID
Fassen Sie den Lebenszyklus von Java-Objekten zusammen, die bei der Android-Entwicklung berücksichtigt werden müssen
In Spring-Security ist die Weiterleitungs-URL meines Anmeldebildschirms falsch und die Anmeldung schlägt fehl.
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
Ist es Mainstream, das schließende Tag des <P> -Tags nicht in Javadoc zu schreiben?
Korrespondenz des Teils, in dem die Authentifizierung # getDetails im Komponententest der Federsicherheit durchgeführt wird