質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

333閲覧

Kotlinでタップした場所に画像を描画すると右下にずれる

user3799257542

総合スコア18

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2022/09/12 12:08

実現したいこと

タップした部分に画像を描画できているのですが右下にずれます。
タップした部分が画像の中央座標となるように描画したいです。

ある記事では、タップした部分は画像の左上座標を示すため右下にずれる・・・と記述があったので、32*32の小さな画像を用意しましたがズレ具合は変わりませんでした。
このズレは何からきているのでしょうか。
またズレはどのように調整すればよいのでしょうか。

ソースコード

onTouchEventで画像を描画する座標をセットしています。
img1.pngの解像度は32*32の小さいファイルです。

activity_main.xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 tools:ignore="UsingOnClickInXml" 6 tools:context=".MainActivity" 7 android:layout_width="match_parent" 8 android:layout_height="match_parent" 9 android:id="@+id/mainActivity" 10 > 11 12 <ImageView 13 android:id="@+id/img1" 14 android:layout_width="100px" 15 android:layout_height="100px" 16 android:src="@drawable/img1" 17 tools:ignore="MissingConstraints" 18 /> 19</androidx.constraintlayout.widget.ConstraintLayout>

MianActivity.kt

1private var x: Float = 0f 2private var y: Float = 0f 3 4override fun onTouchEvent(event: MotionEvent?): Boolean { 5 x = event!!.x 6 y = event.y 7 binding.img1.x = x 8 binding.img1.y = y 9 return true 10}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/09/12 16:42 編集

まず基本的に、xml 等でレイアウトしているビューの位置をコードでテキトウに変更しようとしないで下さい。 各ビューは各々階層上位のビューによって位置や大きさを管理され、必要ならそれらを自動的に変更しています、(表示したら終わりはありません。表示されている間、常に行われる可能性があります。) タップした位置に画像を表示するのであれば、そのような機能を持つビューを探してくるなり作るなりするのが確実でしょう。
user3799257542

2022/09/13 10:22

jimbeさん、ありがとうございます! 根本から見直すべく調べてきます。
guest

回答1

0

ベストアンサー

例えば SurfaceView でタッチ位置に塗り潰し四角を書くようにしてみます。

※ java ですみません。簡単なので kotlin にもすぐ出来ると思いますが。

java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.content.Context; 4import android.graphics.*; 5import android.os.Bundle; 6import android.util.Log; 7import android.view.*; 8 9public class MainActivity extends AppCompatActivity { 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(new TouchView(this)); 15 } 16 17 public static class TouchView extends SurfaceView { 18 public TouchView(Context context) { 19 super(context); 20 } 21 22 @Override 23 public boolean onTouchEvent(MotionEvent event) { 24 Log.d("MainActivity ***", "onTouchEvent: pos=("+event.getX()+","+event.getY()+")"); 25 26 Canvas canvas = getHolder().lockCanvas(); 27 canvas.drawColor(Color.BLACK); 28 29 Paint paint = new Paint(); 30 paint.setColor(Color.GREEN); 31 paint.setStyle(Paint.Style.FILL); 32 canvas.drawRect(event.getX()-50, event.getY()-50, event.getX()+50, event.getY()+50, paint); 33 34 getHolder().unlockCanvasAndPost(canvas); 35 return true; 36 } 37 } 38}

投稿2022/09/13 12:39

jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

user3799257542

2022/09/13 13:23

ありがとうございます! 今基礎の部分を学習しています。まだ間に合っていない状態なので、追いつき次第いただいたコードを確認しようかと思っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問