2014-08-29 47 views
0

我做了自定义的图像视图,其中绘制了一条简单的线条。该图形由一个按钮触发。 当触发onClicklistener不再工作。但是在屏幕上按钮仍然可点击,点击时按钮变为蓝色(默认Android按钮)。我认为这个问题可能出现在“drawLine()”的时候,“setContentView(R.layout.activity_main);”被称为,但不知道为什么以及如何摆脱它。希望你能帮助。按钮只能点击一次自定义视图

MainActivity.java

public class MainActivity extends ActionBarActivity implements OnTouchListener, 
    OnClickListener { 

private int number; 
private Handler handler; 
private boolean Running = true; 
private int endX = 50; 
private int endY = 500; 
private int startX = 50; 
private int startY = 50; 
private int frames = 25; 
ImageView Line01; 
Button buttonLineDrawer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Line01 = (ImageView) findViewById(R.id.Line01); 
    Line01.setVisibility(View.GONE); 
    Button buttonLineDrawer; 
    buttonLineDrawer = (Button) findViewById(R.id.buttonLineDrawer); 
    buttonLineDrawer.setOnClickListener(this); 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public void onClick(View v) { 

    Toast.makeText(getApplicationContext(), "klick", Toast.LENGTH_LONG) 
      .show(); 
    Running = true; 

    number = 0; 
    drawLine(); 

} 

public void drawLine() { 
    Line01.setVisibility(View.VISIBLE); 
    handler = new Handler(); 
    Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 

      while (Running) { 

       try { 
        Thread.sleep(40); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         int coordX = ((((endX - startX)/frames) * number)) 
           + startX; 
         int coordY = ((((endY - startY)/frames) * number)) 
           + startY; 
         number += 1; 
         CustomDraw.setCoordinates(startX, startY, coordX, 
           coordY); 
         setContentView(R.layout.activity_main); 
         if ((coordX - endX) == 0 && coordY - endY == 0) { 
          Running = false; 

         } 
        } 
       }); 
      } 

     } 

    }; 
    new Thread(runnable).start(); 
}} 

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#FF8800" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="de.trialar.linedrawer.MainActivity" > 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/buttonLineDrawer" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 


    <de.trialar.linedrawer.CustomDraw 
     android:id="@+id/Line01" 
     android:layout_width="400dp" 
     android:layout_height="400dp" /> 
</LinearLayout></RelativeLayout> 

CustomDraw.java

public class CustomDraw extends ImageView { 
Paint paint = new Paint(); 

private static int endX= 500; 
private static int endY= 500; 
private static int startX= 50; 
private static int startY= 50; 
static Context context; 

public CustomDraw(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this.context = context; 
} 

public CustomDraw(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CustomDraw(Context context) { 
    super(context); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    paint.setColor(Color.BLACK); 
    paint.setStrokeWidth(10); 
    canvas.drawLine(startX, startY, endX, endY, paint); 
} 

public static void setCoordinates(int startX, int startY, int endX, int endY) { 

    System.out.println("SetCoordinates"); 
    CustomDraw.endX = endX; 
    CustomDraw.endY = endY; 
    CustomDraw.startX = startX; 
    CustomDraw.startY = startY; 
}} 
+0

啊 - 发现它! – 2014-08-29 08:37:41

+0

'setContentView'正在用原来的布局替换原来的布局,包括您设置侦听器的按钮。您只能看到按钮的更改,因为您已将坐标定义为“静态”,因此每个CustomDraw实例都会共享它们。 至少,应该在每次调用'setContentView'后再次添加监听器。无论如何,你实际上不需要多次调用setContentView来开始...... – ivagarz 2014-08-29 08:41:53

回答

0

我想我找到了问题:当您启动handler.run()设置一个新的布局:

public void run() { 
    int coordX = ((((endX - startX)/frames) * number)) + startX; 
    int coordY = ((((endY - startY)/frames) * number)) + startY; 
    number += 1; 
    CustomDraw.setCoordinates(startX, startY, coordX, coordY); 

    //maybe this is wrong 
    setContentView(R.layout.activity_main); 

    //try instead: 
    CustomDraw.invalidate(); 

    if ((coordX - endX) == 0 && coordY - endY == 0) { 
     Running = false; 
    } 
} 

我不知道为什么你设置一个新的布局...我想你要重绘按钮......这就是为什么我在上面的代码块中添加了“重新绘制”行的原因

+0

@ivagarz pointet,你不应该在drawButton上使用静态声明。他非常正确。请不要这样做... – 2014-08-29 09:24:47