【问题标题】:draw a line in a LinearLayout extended class在 LinearLayout 扩展类中画一条线
【发布时间】:2012-10-23 04:47:22
【问题描述】:

我有这门课: 我的问题:

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;
        }
    }
}

执行下一行时,我在屏幕上看到“示例”行:

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 绘制在 de“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);
    }
    }
}

再次感谢您的帮助和关注。很开心!!!

【问题讨论】:

  • 我注意到您正在实现一个 OnClickListener,请理解任何 OnClickListener 都会消耗一个触摸事件,从而阻止它到达您的 Activity 的 onTouchEvent() 方法。你确认onTouchEvent() 被调用了吗?

标签: android android-layout android-canvas


【解决方案1】:

不要将您的绘图代码放入 dispatch draw 中,而是尝试将其放入 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】:

    如果您想为此使用 OnClickListener 接口,您需要将您的活动设置为视图的OnClickListener

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

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

    另外,onTouchEvent 应命名为 onClick

    【讨论】:

    • 当我画一条线时,这条线被绘制在 Y 轴上。 X坐标是完美的。我认为它没有任何解释或意义。我必须减去一定量的 Y 坐标。可能是布局的原因?因为我混合了LinearLayout和RelativeLayout。谢谢
    【解决方案3】:
    • 将 OnTouchEvent 移动到 DrawView,而不是 Activity
    • 让 DrawView 扩展 View,而不是 LinearLayout
    • 代替dispatchDraw,实现onDraw方法并在onTouchEvent中调用invalidate()

    【讨论】:

    • 如果你的答案只是“做 X 而不是 Y”,如果你解释你的断言背后的原因会有所帮助。如果 OP 想要在线性布局上绘制,而不仅仅是普通视图怎么办?
    • 如果我制作 DrawView 扩展视图,而不是 LinearLayout,我不知道要加载我的布局 file.xml。但别担心;)在您的帮助和其他朋友的帮助下,我解决了我的问题。我现在就写解决方案。谢谢!!!
    • 当我画一条线时,这条线被绘制在 Y 轴上。 X坐标是完美的。我认为它没有任何解释或意义。我必须减去一定量的 Y 坐标。可能是布局的原因?因为我混合了LinearLayout和RelativeLayout。谢谢
    【解决方案4】:

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

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

    您可能应该在视图中而不是在活动中接收到触摸事件,那么触摸事件和画布绘制的坐标系将是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多