在LinearLayout扩展类中绘制一条线

时间:2012-10-22 20:12:40

标签: android android-layout android-canvas

我有这门课: 我的问题:

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上看到“example”行:

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()方法,但是因为在“UI”下的onDraw绘制(在布局.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);
    }
    }
}

再次感谢您的帮助和关注。很高兴!!!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
}

答案 2 :(得分:1)

  • 将OnTouchEvent移动到DrawView,而不是活动
  • 使DrawView扩展View,而不是LinearLayout
  • 而不是dispatchDraw,实现方法onDraw和onTouchEvent,调用invalidate()

答案 3 :(得分:0)

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

您的活动中的(0,0)与画布的(0,0)位置不同。

你可能应该在视图中而不是在活动中接收touchevent,然后坐标系对于touchevent和canvas绘制都是相同的。