PCスペック
Windows10 HOME 64bit
メモリ 32GB
プロセッサ Intel Core i7-8700CPU 3.20GHz
Android Studio 3.4.1(最新ver)
デモ用端末(XPERIA OS:7.0 API 24)
androidでお絵描きアプリを作っています.
ネットの情報を参考に,開発を進めているのですが,どうしても解決しない問題があります.
タイトルのように,他クラスから特定のアクティビティのメソッドを呼べないところで詰まっています.
現状,下のコードのように,「アクティビティ画面」+「viewを継承したOekakiクラス」の2つで構成しています.
画面上で,指でなぞった部分が着色され,線が残るような挙動になっています.
ここで,スマホ画面から指を離した際に,MainActivityクラスで記述したインスタンスメソッドを呼ぶためには,OekakiクラスのタッチイベントのMotionEvent.ACTION_UPに,任意のコードを書けばよいのですが,そのためにはMainActivityクラスのインスタンスをnewし直さなければなりません.
しかし,MainActivityクラス内では,ほかにも色んな変数やインスタンスメソッドがあり,新しいMainActivityインスタンスを作ってしまうことで,変数の中身が空っぽになってしまい,都合が悪いです.
試したこと
OekakiクラスをMainActivityの内部クラスにしようとしました.が,レイアウトファイルと上手く紐づけすることができず,エラーが頻発してしまい,うまくいきませんでした・・・
新しくインスタンスを作らない方法で,MainActivityのメソッドを呼ぶ方法はありませんでしょうか?
↓MainActivity.java
java
public class MainActivity extends AppCompatActivity { private Oekaki oekaki; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); oekaki= findViewById(R.id.view); //その他記述あり }
↓Oekaki.java
java
public class Oekaki extends View { private Paint paint; private Path path; //====================================================================================== //-- コンストラクタ //====================================================================================== public Oekaki(Context context) { this(context, null); } //====================================================================================== //-- コンストラクタ //====================================================================================== //レイアウトファイルからビューを初期化 public Oekaki(Context context, AttributeSet attrs) { super(context, attrs); //-- 初期化 //- Path関連 path = new Path(); //- Paint関連 paint = new Paint(); paint.setColor(Color.argb(150, 255, 0, 255)); paint.setStyle(Paint.Style.STROKE);// 描画設定を'線'に設定 paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); paint.setAntiAlias(true);// アンチエイリアスの適応 paint.setStrokeWidth(80);// 線の太さ } //====================================================================================== //-- 描画メソッド //====================================================================================== @Override protected void onDraw(Canvas canvas) { canvas.drawPath(path, paint);// Pathの描画 } //====================================================================================== //-- タッチイベント //===================================================================================== @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN://- 画面をタッチしたとき path.moveTo(x, y);// 始点を設定 invalidate();// 再描画 break; case MotionEvent.ACTION_MOVE://- タッチしながら指をスライドさせたとき path.lineTo(x, y);// 移動先の追加 invalidate();// 再描画 break; case MotionEvent.ACTION_UP://- 画面から指を離したとき path.lineTo(x, y);// 移動先の追加 invalidate();// 再描画 ※ここでMainActivityのメソッドを呼びたい break; } return true; } //====================================================================================== //-- 削除メソッド //====================================================================================== public void clear(){ path.reset(); invalidate(); } }
↓activity.main.xml
xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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" android:id="@+id/constraintLayout" tools:context=".MainActivity"> <view android:id="@+id/view" class="com.example.app.Oekaki" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout>
まだ回答がついていません
会員登録して回答してみよう