2010-11-09 2 views
1

Я пытаюсь сделать что-то похожее на рисунок экрана блокировки Android. У меня есть класс, который расширяет представление, что я создаю несколько экземпляров. Они появляются на экране все сразу.Реализация OnClickListener?

Мне нужно иметь возможность нажимать на них по отдельности, и каждый из них поочередно загорается зеленым цветом, однако только один прослушиватель на ощупь прослушивается сразу, и он принадлежит к последней точке, которая появилась, поэтому, если я нажимаю в любом месте экрана последняя появившаяся точка становится зеленой, независимо от того, где я нажимаю.

Вот код для моего дот класса:

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 несколько раз.

+0

Я догадываюсь, что точка пытается заполнить весь экран, поэтому он полагает, что пресса в любом месте на нем представляет собой прессу на себя, а из-за расслоения это единственная нажатая точка. Я предполагаю, что это будет проблемой с холстами или представлениями ваших точек. –

+0

Как вы предлагаете мне ограничить размер моего класса классов точек? Благодаря! – Eweb

ответ

0

Не могли бы вы добавить прозрачный пользовательский вид сверху (наложение) &, затем отследите события касания и посмотрите, к какой кнопке они принадлежат. (простая математика).

Это облегчит вам рисование линий (аналогично шаблону разблокировки).

+0

Это похоже на рабочее решение, к сожалению, я очень новичок в сцене Android и не знаю, как это сделать, не могли бы вы привести пример того, как это сделать или ограничить размер моего представления, чтобы он не заполняет весь экран? Это будет высоко ценится. Благодаря! – Eweb

Смежные вопросы