Implementing an OnClickListener?
I am trying to do something similar to that of the android lock screen pattern. I have a class that extends a view that I create multiple instances of. These appear on the screen all at once.
I need to be able to click on them individually and have each one turn green individually, however only one on touch listener is listening at once and it belongs to the last dot which appeared, so if I click anywhere on the screen the last appeared dot turns green no matter where I click.
Here is the code for my dot class:
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(c开发者_如何学JAVAanvas);
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;
}
*/
}
And here is my main class:
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));
}
}
In the code I called newdotdraw multiple times.
Could you add a transparent custom view on top (overlay) & then track the touch events and see to which button they belong. (simple math).
That would make it easier for you to draw lines (similar to the unlock pattern), too.
精彩评论