2012-10-22 87 views
2

我有这个类: 我的问题:画一条线

public class Example extends Activity implements OnClickListener{ 
    DrawView view1; 
    Canvas canvas = new Canvas(); 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     view1 = new DrawView(this); 
     setContentView(view1); 
    } 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
    int x = (int) event.getX(); 
    int y = (int) event.getY(); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      view1.setFirstCoord(x, y); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      break; 
     case MotionEvent.ACTION_UP: 
      view1.setSecondCoord(x, y); 
      view1.dispatchDraw(canvas); 
      break; 
     } 
    return true; 
    } 

    public class DrawView extends LinearLayout { 
     private Paint paint = new Paint(); 
     public int x1, x2; 
     public int y1, y2; 

     public DrawView(Context c){ 
      super(c);   
      LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      addView(inflater.inflate(R.layout.union, null)); 

      x1 = 0; 
      x2 = 0; 
      y1 = 0; 
      y2 = 0; 

      paint.setColor(Color.BLACK); 
      paint.setAntiAlias(true); 
      paint.setDither(true); 
      paint.setStyle(Paint.Style.STROKE); 
      paint.setStrokeJoin(Paint.Join.ROUND); 
      paint.setStrokeWidth(10);   
     } 

     @Override 
     public void dispatchDraw(Canvas canvas) { 
      super.dispatchDraw(canvas); 
      canvas.drawLine(0, 50, 900,2000 , paint);//WORKS 
      canvas.drawLine((int) x1, (int) y1,(int) x2,(int) y2, paint);//NO WORKS 
     } 

     public void setFirstCoord(int e, int f){ 
      x1 = e; 
      y1 = f; 
     } 

     public void setSecondCoord(int e, int f){ 
      x2 = e; 
      y2 = f; 
     } 
    } 
} 

当下一行执行我看到在screem的“榜样”行:

canvas.drawLine(0, 50, 900,2000 , paint); 

但是,当下面一行“执行”不绘制任何直线。为什么???

canvas.drawLine((int) x1, (int) y1,(int) x2,(int) y2, paint); 

我也试图与:

canvas.drawLine(x1, y1, x2, y2, paint); 

但是,很明显,结果都是一样的。

我也试图与执行的onDraw()方法,但任何线画,因为onDraw有下德“UI”画

我希望找到人谁可以帮我(布局.xml文件的内容下) 。我认为解决方案可以很容易,但我会疯狂尝试,而不会找到解决方案。

谢谢!

解决办法:

public class Example extends Activity implements OnClickListener{ 
    DrawView view1; 
    Canvas canvas = new Canvas(); 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     view1 = new DrawView(this); 
     setContentView(view1); 
     view1.setOnClickListener(this); 
    } 

    public class DrawView extends LinearLayout { 
     private Paint paint = new Paint(); 
     public int x1, x2; 
     public int y1, y2; 

     public DrawView(Context c){ 
      super(c);   
      LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      addView(inflater.inflate(R.layout.union, null)); 

      x1 = 0; 
      x2 = 0; 
      y1 = 0; 
      y2 = 0; 

      paint.setColor(Color.BLACK); 
      paint.setAntiAlias(true); 
      paint.setDither(true); 
      paint.setStyle(Paint.Style.STROKE); 
      paint.setStrokeJoin(Paint.Join.ROUND); 
      paint.setStrokeWidth(10);   
     } 

     public boolean onTouchEvent(MotionEvent event) { 
     int x = (int) event.getX(); 
     int y = (int) event.getY(); 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      view1.setFirstCoord(x, y); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      break; 
     case MotionEvent.ACTION_UP: 
      view1.setSecondCoord(x, y); 
      view1.onDraw(canvas); 
      view1.postInvalidate(); 
      break; 
     } 
     return true; 
     } 

     public void setFirstCoord(int e, int f){ 
      x1 = e; 
      y1 = f; 
     } 

     public void setSecondCoord(int e, int f){ 
      x2 = e; 
      y2 = f; 
     } 

     public void onDraw(Canvas canvas){ 
     canvas.drawLine((int) x1, (int) y1,(int) x2,(int) y2, paint); 
    } 
    } 
} 

再次感谢您的帮助和关注。我的荣幸!!!

+0

我注意到你正在实现一个OnClickListener,明白任何OnClickListener都会消耗一个触摸事件来阻止它到达你的Activity的'onTouchEvent()'方法。你是否验证过'onTouchEvent()'被调用? – Sam

回答

1

而不是把你的绘图代码放在调度绘制,尝试把它放在onDraw。

然后修改onTouch方法是这样的:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    int x = (int) event.getX(); 
    int y = (int) event.getY(); 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
    view1.setFirstCoord(x, y); 
    break; 
    case MotionEvent.ACTION_MOVE: 
    break; 
    case MotionEvent.ACTION_UP: 
    view1.setSecondCoord(x, y); 
    view1.postInvalidate(); 
    break; 
    } 
    return true; 
} 
1

如果你要使用这个OnClickListener接口,你需要设置你的活动作为一个OnClickListener的观点:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    view1 = new DrawView(this); 
    setContentView(view1); 

    // Add this: 
    view1.setOnClickListener(this); 
} 

否则,onTouchEvent将永远不会被调用。

另外,onTouchEvent应该被命名为onClick

+0

当我绘制一条线时,该线被绘制在Y轴上位移。 X坐标是完美的。我想,它没有解释或意义。我必须减去一定量的Y坐标。这可能是由于布局?因为我混合了LinearLayout和RelativeLayout。谢谢 – Adrian

1
  • 移动的onTouchEvent到drawView函数,而不是活动
  • 让drawView函数扩展视图,而不是LinearLayout中
  • 相反dispatchDraw的,实施方法onDraw和onTouchEvent,调用invalidate()
+1

如果你的答案只是“做X而不是Y”,如果你解释你的断言背后的原因,这将有所帮助。如果OP想要使用线性布局,而不仅仅是简单的视图呢? – Tim

+0

如果我使DrawView扩展视图,而不是LinearLayout,我不知道要加载我的布局file.xml。但别担心;)在你的帮助和其他朋友的帮助下,我解决了我的问题。我现在写解决方案。谢谢!!! – Adrian

+0

当我绘制一条线时,该线被绘制为在Y轴上位移。 X坐标是完美的。我想,它没有解释或意义。我必须减去一定量的Y坐标。这可能是由于布局?因为我混合了LinearLayout和RelativeLayout。谢谢 – Adrian

0

我认为你的问题可能是b e您在活动中检索到的x/y坐标位于屏幕空间中,而画布上的绘制坐标位于画布空间中。

所以您的活动中的(0,0)与您的画布的(0,0)不是同一个位置。

您应该可以在视图内而不是在活动中接收touchevent,那么坐标系对于touchevent和canvas绘制都是相同的。