【问题标题】:Adding path objects to arraylist将路径对象添加到arraylist
【发布时间】:2014-01-19 05:31:52
【问题描述】:

我创建了一个路径对象,如下所示,它绘制不同的形状。不同的按钮响应在画布上绘制不同的形状。每次将按钮调用到数组列表时,我都会尝试保存路径,并在每次增加数组列表时重绘画布上的所有路径。

        public class DrawImage extends SurfaceView {
            ArrayList<Path> paths = new ArrayList<Path>();
        Path path = new Path();

                 @Override
                protected void onDraw(Canvas canvas) {
                    // TODO Auto-generated method stub
                    super.onDraw(canvas);


            if (MainActivity.isRectangle) {


                        path.moveTo(1, 1);
                        path.lineTo(90, 1);
                        path.lineTo(90, 60);
                        path.lineTo(1, 60);

                        path.close();


                        paintColor.setColor(Color.RED);
                        paintColor.setStrokeWidth(2);
                        paintColor.setStyle(Paint.Style.STROKE);

                        paths.add(path);

             for (Path p : paths) {
                    canvas.drawPath(p, paintColor);
                }

                    }
if (MainActivity.isTriangle) {

                  path.moveTo(0, 40);
                  path.lineTo(50, 0);
                  path.lineTo(50, 50);
                  path.lineTo(50, 50);
                  path.lineTo(0, 40);

                        path.close();


                        paintColor.setColor(Color.RED);
                        paintColor.setStrokeWidth(2);
                        paintColor.setStyle(Paint.Style.STROKE);

                        paths.add(path);

             for (Path p : paths) {
                    canvas.drawPath(p, paintColor);
                }

                    }



            }

这是我的主要活动

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

        dI = new DrawImage(this);

        rectbutton = (Button) findViewById(R.id.pointerbutton);


        RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.relativeLayout);

        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.MATCH_PARENT);
        // add here other layout params rules to make your
        // custom view stay below the buttons

        lp.addRule(RelativeLayout.BELOW, R.id.rectbutton);

        dI.setLayoutParams(lp);

        mainLayout.addView(dI);

rectbutton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                // TODO Auto-generated method stub
                isTriangle = false;
                isRectangle = true;
                isCircle= false;
                isParallelogram = false;
                isTapezium = false;


                dv.invalidate();


            }// onclick

        });

trianglebutton.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {

                    // TODO Auto-generated method stub
                    isTriangle = true;
                    isRectangle = false;
                    isCircle= false;
                    isParallelogram = false;
                    isTapezium = false;


                    dv.invalidate();


                }// onclick

            });

问题:两个路径对象重叠,第二次调用矩形按钮或三角形按钮时,没有出现新的路径对象。

请指教谢谢。

DrawImage 类的修正

 public class DrawImage extends SurfaceView  {


    Paint paintColor = new Paint();

    Path path = new Path();

    Canvas canvas;

    float x = 0, y = 0;


    public static ArrayList<Path> paths = new ArrayList<Path>();


    public DrawImage(Context context) {

        super(context);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);

        Paint background = new Paint();
        background.setColor(Color.WHITE);
        canvas.drawARGB(255, 255, 255, 255);

        paintColor.setColor(Color.GRAY);
        paintColor.setStrokeWidth(2);
        paintColor.setStyle(Paint.Style.STROKE);

        for (Path p : paths) {
            canvas.drawPath(p, paintColor);
        }

    }


    public void addRectangle() {

        Path path = new Path();

          path.moveTo(x+1, y+1);
              path.lineTo(x+90, y+1);
              path.lineTo(x+90, y+60);
              path.lineTo(x+1, y+60);

        path.close();
        paths.add(path);
    }


}

对 mainActivity 的修改

layout.setOnTouchListener(new OnTouchListener() {

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

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:

            x = event.getX();

            y = event.getY();

            et1.setText(String.valueOf(x));
            et2.setText(String.valueOf(x));

            break;

        }
        dv.invalidate();
        return true;

    }
});

}

【问题讨论】:

  • 嗯,没有代码可以将任何东西放入数组列表中,所以它当然是空的。
  • @Ridcully 我已经对问题进行了修改。
  • 我的印象是您不理解您正在使用的代码。 ArrayList&lt;Path&gt; paths 你在你的课堂上永远不会添加任何东西,所以当你稍后迭代它时,什么都不会被渲染。
  • @Ridcully 对不起,我正在自学中。在我的代码中,“paths.add(path);”将路径添加到我已声明的数组列表。所以我用的方法不对?我做了一个调试,我的数组是空的。如果可能的话,你能给我一个添加路径到数组列表的例子吗?或纠正我?谢谢
  • 对不起,我错过了那行。尽管如此,这是一种非常奇怪的方法。在我的回答中,我会尝试提出更好的方法。

标签: android arraylist path android-canvas draw


【解决方案1】:

这是您的代码中出现的一个简单问题。

看看你什么时候做Paths.add(path) - 它将路径的地址存储为一个对象。

而不是这样做Paths.add(new Path(path)) - 现在这将创建一个新对象,该对象将存储在arraylist 中。

现在你为什么得到一个空白路径?

原因很简单,当您执行path.reset() 时,路径为空,而arraylist 指向的地址现在已被重置。

【讨论】:

    【解决方案2】:

    我会尝试这样的:

    addRectangle() 方法添加到您的DrawImage 类(以及三角形的类似方法...)

    public void addRectangle() {
         Path path = new Path();
         path.moveTo(1, 1);
         path.lineTo(90, 1);
         path.lineTo(90, 60);
         path.lineTo(1, 60);
         path.close();
         paths.add(path);
    }
    

    将您的draw 方法减少到此(实际上,为了提高性能,您还应该只初始化一次Paint 对象,而不是每次调用onDraw

    protected void onDraw(Canvas canvas) {
         paintColor.setColor(Color.RED);
         paintColor.setStrokeWidth(2);
         paintColor.setStyle(Paint.Style.STROKE);
         for (Path p : paths) {
             canvas.drawPath(p, paintColor);
         }
    }
    

    在您的 MainActivity 中删除所有静态 isRectangle... 变量,而不是在 onClick 方法中,例如您的矩形按钮执行此操作(我在这里假设 dv 是您的 DrawImage 实例:

    public void onClick(View arg0) {
            dv.addRectangle();
            dv.invalidate();
    }
    

    请注意,所有矩形都绘制在相同的位置,因此添加多少不会有区别。但是您可以轻松扩展addRectangle() 方法以传递起始位置、矩形大小等。

    另外请注意,我认为您的代码中的主要错误是,您已将 path 定义为 DrawImage 中的全局变量,因为您总是将相同的对象添加到列表中,因此list 将始终只包含该单个对象。

    【讨论】:

    • 对不起,我没有带我的电脑,我已经尝试过你在画布上添加矩形的方法,它可以工作。但是,我希望仅在单击按钮并在画布上触摸后才绘制矩形。现在,它的矩形路径是固定的,我希望它根据用户的触摸坐标来绘制。我写了一个 ontouch 方法来获取用户触摸的 x 和 y,并根据 x 和 y 的值,移动位置的路径 (path.moveTo(x,y) 并绘制矩形。你能告诉我我写的代码吗?正确吗?
    • 我现在只能在单击按钮并触摸画布后绘制矩形。但是,我在获取用户触摸的 x 和 y 时遇到问题。
    • 你试过调试你的代码吗?从事件中获取 x 和 y 似乎没问题。然而,只为 ACTION_DOWN 或 ACTION_UP 之一设置 x、y 就足够了。无需对所有三个操作都执行此操作。
    • 我能够根据 mainActivity 中的 onTouch 方法获取 x 和 y 值。我无法将 x 和 y 值传递给 DrawImage 类,x 和 y 的值反映到当我进行调试时为 0。我再次更新了我的代码。请指教谢谢。
    • 很抱歉,这超出了您原始问题的范围。也许您应该从一些更简单的程序开始,或者寻找一些基本的 Java 教程。
    猜你喜欢
    • 2016-06-22
    • 1970-01-01
    • 2017-12-12
    • 2011-12-24
    • 2016-09-26
    • 1970-01-01
    • 2016-08-10
    • 2021-05-26
    相关资源
    最近更新 更多