Пользовательский просмотр клика слушателя охватывает весь экран, а не только вид - PullRequest
0 голосов
/ 24 декабря 2011

Я создал класс, который расширяет View для того, чтобы нарисовать его самостоятельно, в определенной позиции.Я переопределил метод onDraw:

@Override
public void onDraw(Canvas canvas) {     
    super.onDraw(canvas);   
    canvas.drawBitmap(pic, x, y, null);
}

Когда я устанавливаю прослушиватель щелчков и добавляю представление в макет, событие запускается, даже когда я не нажимаю на область представления.Я попытался установить параметры макета для переноса содержимого без посторонней помощи, но попытка удаления "super.onDraw" тоже не помогла.Если я выполняю те же действия со встроенным представлением (например, кнопкой или представлением изображения), этого не происходит.

В чем проблема?Я делаю что-то не так?

Дополнительный код:

public class FlowingPicture extends View {

    private float x,y;
    private Bitmap pic;
    private int screenWidth;
    private int screenHeight;

    public FlowingPicture(Context context, Bitmap pic, int x, int y, WindowManager screenSize) {
        super(context);
        screenHeight = screenSize.getDefaultDisplay().getHeight();
        screenWidth = screenSize.getDefaultDisplay().getWidth();
        this.pic = pic;
        this.x = x;
        this.y = y;
    }

    public void move(float x, float y){
        this.x += x;
        if(this.x > screenWidth)
            this.x = -(this.pic.getWidth());
        this.y += y;
        this.postInvalidate();
    }

    public float getX(){
        return x;
    }

    public float getY(){
        return y;
    }

    @Override
    public void onDraw(Canvas canvas) {     
        super.onDraw(canvas);
        canvas.drawBitmap(pic, x, y, null);
    }
}

Часть кода, которая создает представление:

for(int i=0; i<arr.size(); i++){
    Bitmap b = arr.get(i).getFlowProfilePic();
    int x, y;
    do{
        y = rand.nextInt(screenHeight - b.getHeight() - 30);
        x = rand.nextInt(screenWidth);
    }
    while (!checkPoint(x, b.getWidth(), y, b.getHeight()));
    takenPoints.add(new Point(x, y));
    FlowingPicture fp = new FlowingPicture(FlowingFeeds.this, b, -(x + b.getWidth()), y, getWindowManager());
    fp.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(FlowingFeeds.this, "I'm working!", Toast.LENGTH_SHORT).show();
        }
    });
    fp.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    flowingObjectsList.add(fp);
}
parseHandler.sendEmptyMessage(0);

ParseHandler, добавляющий представления кмакет:

for(FlowingPicture fp : flowingObjectsList){                
    layout.addView(fp);
}
flow = new Thread(FlowingFeeds.this);
flow.start();

И последняя часть:

layout = new FrameLayout(this);
layout.setBackgroundColor(Color.WHITE);
setContentView(layout);

Ответы [ 2 ]

0 голосов
/ 25 декабря 2011

Хорошо, я не решил, но думаю, что знаю, в чем проблема. Поскольку я перемещаю вид по всему экрану, он дает вид на экране размером с экран. Поэтому я просто добавляю сенсорный прослушиватель к макету, на котором отображаются виды, который берет x и y касания и проверяет, присутствует ли это касание в каком-то виде. Не самое элегантное решение, но я сделал все возможное!

Спасибо всем, кто пытался помочь! :)

0 голосов
/ 24 декабря 2011

Попробуйте вызвать super.onDraw(canvas) последним в вашем методе, но это может или не может помочь вам понять, куда вы хотите пойти.

Трудно сказать, что вы делаете неправильно, но вы пытались объявить BitmapField в своемраскладка.Если не нужно больше показывать, похоже, что все вы рисуете изображение на экране.

Также в вашем main.xml вы можете создавать то, что вам нужно внутри RelativeLayout,и включите TextFields, BitmapFields и любые другие поля, которые вам нужны, таким образом, вам не придется беспокоиться о onDraw().

Прелесть использования ресурсов XML в том, что естьсвойство android:onClick="someMethod".В этом упражнении вам понадобится метод:

public void someMethod( View view ) {
    // do stuff here
}

Таким образом, не нужно возиться со слушателями.

...