setOnTouchListener

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von krackmoe, 08.03.2011.

  1. krackmoe, 08.03.2011 #1
    krackmoe

    krackmoe Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    02.03.2011
    Ich hab eine Klasse die Activity extended und eine die View extended.

    In der die View extended habe ich eine onDraw Methode, und in dieser eine setOnTouchListener.
    Dort möchte ich einfach x und y Koordinaten abfragen, und wenn diese dem entsprechen was ich haben will, soll er dem LinearLayout per addView einen Kreis reinzeichnen lassen.
    Ich bekomm aber immer beim addView eine NPE, versteh aber nicht warum!

    Maybe könnt ihr mir helfen, wäre super.

    View Klasse:
    Code:
    package com.tictactoe;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.LinearLayout;
    
    public class GameWindow extends View {
    	private Paint mLine;
    	private float mTouchX;
    	private float mTouchY;
    	private int x1TopBottom;
    	private int x2TopBottom;
    	private int y1LeftRight;
    	private int y2LeftRight;
    	private int xRight;
    	private int yBottom;
    	private LinearLayout parent;
    	
    	public GameWindow(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		
    	}
    
    	@Override
    	protected void onDraw(Canvas canvas) {
    		super.onDraw(canvas);
    		int width = getMeasuredWidth();
    		int height = getMeasuredHeight();
    		mLine = new Paint();
    		mLine.setColor(Color.BLACK);
    		mLine.setStrokeWidth(3);
    		
    		x1TopBottom = width/3;
    		x2TopBottom = x1TopBottom*2;
    		int yTop = 0;
    		int xLeft = 0;
    		y1LeftRight = height/3;
    		y2LeftRight = y1LeftRight*2;
    		xRight = width;
    		yBottom = height;
    		
    		canvas.drawLine(x1TopBottom, yTop+20, x1TopBottom, yBottom-20, mLine);
    		canvas.drawLine(x2TopBottom, yTop+20, x2TopBottom, yBottom-20, mLine);
    		canvas.drawLine(xLeft+20, y1LeftRight, xRight-20, y1LeftRight, mLine);
    		canvas.drawLine(xLeft+20, y2LeftRight, xRight-20, y2LeftRight, mLine);
    		
    		parent.setOnTouchListener(new OnTouchListener(){
    			@Override
    			public boolean onTouch(View v, MotionEvent event) {
    				if(event.getAction() == MotionEvent.ACTION_DOWN){
    					mTouchX = event.getX();
    					mTouchY = event.getY();
    					LinearLayout linearL = (LinearLayout)v;
    					
    					if(mTouchX >= 0 && mTouchX <= x1TopBottom && mTouchY <= y1LeftRight && mTouchY >= 0){
    						try{
    							linearL.addView(new Circle(GameWindow.this.getContext(), mTouchX, mTouchY, 25));
    						}
    						catch(Exception e){
    							Log.v("tictactoe"," "+e);
    						}
    					}
    				}
    				return false;
    			}
    			
    		});
    		
    	}
    
    	public void setParentView(LinearLayout linearLayout) {
    		this.parent = linearLayout;		
    	}
    }
    
    
    Circle
    Code:
    package com.tictactoe;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.Log;
    import android.view.View;
    
    public class Circle extends View {
    	private float x;
    	private float y;
    	private int r;
    	private Paint mPaint;
    	
    	public Circle(Context context, float x, float y, int r){
    		super(context);
    		this.x = x;
    		this.y = y;
    		this.r = r;
    		mPaint.setColor(Color.RED);
    	}
    	@Override
    	protected void onDraw(Canvas canvas) {
    		super.onDraw(canvas);
    		canvas.drawCircle(x,y,r, mPaint);
    	}
    }
    
    
    Activity Klasse
    Code:
    package com.tictactoe;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.LinearLayout;
    
    public class GameActivity extends Activity {
    	private GameWindow gameWindow;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.game_window);
    		
    		gameWindow = (GameWindow)findViewById(R.id.game_window);
    		gameWindow.setParentView((LinearLayout)findViewById(R.id.linearL));
    		gameWindow.setFocusable(true);
    		gameWindow.setFocusableInTouchMode(true);
    		
    		
    	}
    	
    }
    
    
     
  2. Unicate, 09.03.2011 #2
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Prüf mal mit dem debugger ob linearL null wird, nachdem es gesetzt worden ist. Ich nehm mal an das das der Fall ist.

    Dann kann er entweder die im Listener ankommende View nicht in ein LinearLAyout umwandeln oder es kommt gar keine View an (glaub ich nicht)
     
  3. krackmoe, 09.03.2011 #3
    krackmoe

    krackmoe Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    02.03.2011
    Ja linearL ist null.

    Nur mhh.. warum? :)
     
  4. Unicate, 09.03.2011 #4
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Wie kommst du darauf, das die in onTouch übergebene View ein LinearLayout ist?

    Hast du auch mal geprüft ob die view die im Listener ankommt überhaupt != null ist? (glaub ich nicht, aber sicher ist sicher)
     

Diese Seite empfehlen