android studioのお勉強:円を描画する
クリックしている間、円が左上から右下に流れていきます。Tips 別スレッドからUIを操作する HandlerとMessage - 別スレッドでのGUI操作 Android Concurrent Programming: Looper, Handler and Message [Android] Activityに時計を表示する(Activityの非同期更新)アンドロイドで別スレッドからUIを動かせないらしい。上記はそのための仕組みが述べられている。MainActivity.javapackage com.example.animatiothread;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.os.Bundle;import android.os.Handler;import android.os.Message;import androidx.appcompat.app.AppCompatActivity;import android.view.MotionEvent;import android.view.View;import android.widget.ImageView;import android.widget.TextView;public class MainActivity extends AppCompatActivity { TextView log; ImageView testfield; Bitmap test; Canvas testc; final int testsize = 200; boolean testExec = false, testStop = false; protected Handler intreq; Rect testRect; Paint testColor; Thread testThread; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); log = findViewById(R.id.log); testfield = findViewById(R.id.testfield); test = Bitmap.createBitmap(testsize, testsize, Bitmap.Config.ARGB_8888); testc = new Canvas(test); testc.drawColor(Color.WHITE); testfield.setImageBitmap(test); testfield.setOnTouchListener(new downCatch()); testRect = new Rect(0, 0, 10, 10); testColor = new Paint(); //default black testColor.setStyle(Paint.Style.FILL); intreq = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if (msg.what == 0) { if (test != null && testfield != null) { paintPicture(); } } else { Bundle msgd = msg.getData(); } return true; } }); } public void test_run() { if (testStop) { testStop = false; synchronized (testThread) { testThread.notify(); } } else { testExec = true; if (testThread != null) testThread = null; testThread = new Thread(new animator()); testThread.start(); } } public void stop() { if (!testStop) { if (testThread.isAlive()) { testStop = true; } } } class downCatch implements View.OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: test_run(); return true; case MotionEvent.ACTION_UP: stop(); return true; } return false; } } public void paintPicture() { testfield.setImageBitmap(test); testfield.invalidate(); } class animator implements Runnable { Paint paint; @Override public void run() { paint = new Paint(); boolean done = false; int x = 0; testColor.setColor(Color.BLUE); while (!done) { if (!testExec) { return; } if (testStop) { try { synchronized (testThread) { testThread.wait(); } } catch (InterruptedException e) { } } testc.drawCircle(x, x,x/ 2, paint); x++; intreq.sendEmptyMessage(0); try { Thread.sleep(100); } catch (InterruptedException e) { } if (x >= testsize) done = true; } testExec = false; } }}activity_main.xml<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.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" tools:context=".MainActivity"> <ImageView android:id="@+id/testfield" android:layout_width="0dp" android:layout_height="500dp" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:clickable="true" android:focusable="true" android:focusableInTouchMode="true" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> <TextView android:id="@+id/log" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TestDraw:" android:textSize="40sp" /></androidx.constraintlayout.widget.ConstraintLayout>色を変化させてみた。paint.setColor(Color.argb(x*10,x*20,x*30,x*40));testc.drawCircle(x, x,x/ 2, paint);カラフルに遊んでみるRandom random = new Random();paint.setColor(Color.argb(x*10,x*20,x*30,x*40));randomX = random.nextInt(200);randomY = random.nextInt(200);testc.drawCircle(randomX, randomY,randomX/10, paint);【中古】現場で使える〈逆引き+実践〉Androidプログラミングテクニック / 石原正樹【中古】 Androidプログラミングバイブル SDK4/3/2対応 /布留川英一【著】 【中古】afb【中古】 作りながら覚えるAndroidプログラミング /松岡宣【著】 【中古】afb【中古】 Google Androidプログラミング入門 /江川崇,藤井大助,麻野耕一,藤田泰介,山田暁通【ほか共著】 【中古】afb