私はアンドロイドのロック画面パターンと似たようなことをしようとしています。複数のインスタンスを作成するビューを拡張するクラスがあります。これらが一斉に画面に表示されます。
それらを個別にクリックして、それぞれを個別に緑色に変える必要がありますが、一度にリッスンしているオンタッチ リスナーは 1 つだけであり、それは最後に表示されたドットに属しているため、画面上の任意の場所をクリックすると、最後に表示されたドットが表示されますどこをクリックしても緑色に変わります。
これが私のドットクラスのコードです:
package com.ewebapps;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class Dot extends View implements OnTouchListener {
private final float x;
private final float y;
private final int r;
private final Paint mBlack = new Paint(Paint.ANTI_ALIAS_FLAG);
private final Paint mWhite = new Paint(Paint.ANTI_ALIAS_FLAG);
private final Paint mGreen = new Paint(Paint.ANTI_ALIAS_FLAG);
private boolean touched;
/*
public boolean onInterceptTouchEvent(View v, MotionEvent event) {
touched = true;
//mPaint.setColor(0xFF00FF00); // Turn dot green.
invalidate();
return true;
}
*/
public Dot(Context context, float x, float y, int r) {
super(context);
mBlack.setColor(0xFF000000); //Black
mWhite.setColor(0xFFFFFFFF); //White
mGreen.setColor(0xFF00FF00); //Green
this.x = x;
this.y = y;
this.r = r;
this.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
touched = true;
//mPaint.setColor(0xFF00FF00); // Turn dot green.
v.invalidate();
return true;
}
});
}
/* @Override
public boolean dispatchTouchEvent(MotionEvent event) { // On touch.
touched = true;
//mPaint.setColor(0xFF00FF00); // Turn dot green.
this.invalidate();
return super.dispatchTouchEvent(event);
}
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(x, y, r+2, mWhite); //White stroke.
if(!touched)
{
canvas.drawCircle(x, y, r, mBlack); //Black circle.
}
else
{
canvas.drawCircle(x, y, r, mGreen); //Green circle.
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
/* @Override
public boolean onTouch(View v, MotionEvent event) {
touched = true;
//mPaint.setColor(0xFF00FF00); // Turn dot green.
invalidate();
return true;
}
*/
}
そして、ここに私のメインクラスがあります:
package com.ewebapps;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Display;
import android.view.WindowManager;
import android.widget.FrameLayout;
public class dots extends Activity{
public Boolean isRunning, isPaused;
public int maxdots = 20;
public int currentdotdraw = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void newdotdraw(){
Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int screenwidth = display.getWidth();
int screenheight = display.getHeight();
int x = (int) (Math.random() * screenwidth) + 1;
int y = (int) (Math.random() * screenheight) + 1;
FrameLayout main = (FrameLayout) findViewById(R.id.main_view);
main.addView(new Dot(this,x,y,25));
}
}
コードでは、newdotdraw を複数回呼び出しました。