2011-12-23 2 views
0

보기를 확장하여 자신을 특정 위치에 그리는 클래스를 만들었습니다. 나는 onDraw 방법을 오버라이드 (override) 한 : 나는 클릭 리스너를 설정하고 내가보기의 영역을 클릭 아니에요 경우에도, 레이아웃에 이벤트가 발생을보기를 추가사용자 정의보기 클릭 청취자가보기 대신 모든 화면을 덮습니다.

@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); 
+0

더 많은 코드를 표시하고 수용 등급을 높이십시오 (돌아가서 과거 대답을 수락하십시오). –

+0

은 전체 화면을 포함하는보기입니다.이를 테스트하는 좋은 방법은 setBackgroundColor를 투명한 값으로 설정하고 보기가 화면에 배치되었습니다. –

+0

XML 리소스를 사용해 보시기 바랍니다. 나는 그것을 훨씬 깨끗하게 발견한다. –

답변

0

좋아, 나는 그것을 해결하지 못했지만 문제가 무엇인지 알 것 같아요. 화면 전체에서보기를 이동하기 때문에 화면 크기만큼의 공간이 뷰에 표시됩니다. 그래서 뷰가있는 레이아웃에 터치 리스너를 추가합니다. 터치 리스너는 터치의 x 및 y를 취하여이 터치가 일부보기에 있는지 확인합니다. 가장 우아한 솔루션은 아니지만 최선을 다했습니다.

도움을 주신 모든 분들께 감사드립니다. :)

0

귀하의 방법에서 마지막으로 super.onDraw(canvas) 번으로 전화 해보십시오. 그러나 원하는 곳으로 갈 수도 있고 그렇지 않을 수도 있습니다.

당신이 뭘 잘못하고 있는지 알려주지는 않지만 레이아웃에서 BitmapField를 선언 해 보았습니다. 더 많은 것을 보여줄 필요가 없다면, 모든 사람들이 화면에 그림을 그린 것처럼 보입니다. 당신의 main.xml에서 또한

, 당신이 RelativeLayout 안에해야하고, TextFields, BitmapFields, 이제까지 어떤 다른 분야 당신이 필요로하는, 그런 식으로 포함 무엇을 만들 수 있습니다, 당신은에 대한 onDraw()을 걱정할 필요가 없습니다.

XML 리소스를 사용할 때의 장점은 android:onClick="someMethod" 속성입니다. 활동에서 다음과 같은 방법이 필요합니다.

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

이렇게하면 청취자를 혼내 줄 필요가 없습니다.

+0

답변 해 주셔서 감사합니다.하지만 어떤 이유로 든이 수업을 만들었습니다. 화면에서 이동하고 동시에 클릭 할 수있는 이미지가 필요합니다. 안타깝게도 안드로이드 애니메이션을 사용하면 뷰의 "그래픽"만 움직이게되고 뷰 자체는 움직이지 않으므로 애니메이션 된 그림을 클릭 할 때 리스너가 실행되지 않습니다. – Elad92

+0

@ Elad92 당신은 이미지를 포함하고있는 어떤 것이라도 애니메이션을 적용 할 수 있지만 애니메이션이 끝날 때까지 주 스레드는 아마도 막힐 것입니다. –