Path path = new Path();
            path.moveTo(50, 0);
            path.lineTo(0, 50);
            path.lineTo(50, 100);
            path.lineTo(100, 50);
            //封闭前面点所绘制的路径
            path.close();ShapeDrawable mDrawables = new ShapeDrawable(new PathShape(path, 100, 100));请问这个path对象的4个顶点的坐标应该是个正方形,为什么画出来效果是个菱形。PathShape构造器中后2个参数,是如何起作用的,有时是100,有时是150,不知道如何计算。多边形的造型是否和setBounds(int left, int top, int right, int bottom)
方法有关,请高手解答,谢谢

解决方案 »

  1.   

     path.moveTo(0, 0);
     path.lineTo(0, 100);
     path.lineTo(100, 100);
     path.lineTo(100, 0);
    这才是正方形吧...LZ那个画法就是菱形
      

  2.   

    •The setBounds(Rect) method must be called to tell the Drawable where it is drawn and how large it should be. All Drawables should respect the requested size, often simply by scaling their imagery. 和setBounds有关,不然会自动拉伸的这里设成正方形就可以
      

  3.   


                    Path path = new Path();
                    path.moveTo(50, 0);
                    path.lineTo(0, 50);
                    path.lineTo(50, 100);
                    path.lineTo(100, 50);
                    //封闭前面点所绘制的路径
                    path.close();ShapeDrawable mDrawables = new ShapeDrawable(new PathShape(path, 100, 100));setBounds(0,0,300,50);
    刚好能撑满,形成一个菱形,这些数值之间的关系是怎么样的呢
      

  4.   

    这里设成setBounds(0,  0 ,100  ,100 ) ;就是原始大小了关系是这样的
    setBounds(0,  0 ,x  ,y  ) ;
    PathShape(path, 100,100) ;比例大小是x/100  y/100
    如setBounds(0,  0 ,200  ,300 ) ;x放大2倍 y放大3倍public PathShape (Path path, float stdWidth, float stdHeight) 
    Since: API Level 1 PathShape constructor.Parameters
    path  a Path that defines the geometric paths for this shape 
    stdWidth  the standard width for the shape. Any changes to the width with resize() will result in a width scaled based on the new width divided by this width. stdHeight  the standard height for the shape. Any changes to the height with resize() will result in a height scaled based on the new height divided by this height.  
      

  5.   

    多些6楼的讲解,有点明白了。 mShapeDrawable.setBounds(70, 250, 150, 280);////此处画个椭圆

    /* 绘制图像 */
    mShapeDrawable.draw(canvas);

    Path path1 = new Path();
    /*设置多边形的点*/
    path1.moveTo(150+5, 80+80-50);
    path1.lineTo(150+45, 80+80-50);
    path1.lineTo(150+30, 80+120-50);
    path1.lineTo(150+20, 80+120-50);
    /* 使这些点构成封闭的多边形 */
    path1.close();

    //PathShape后面两个参数分别是宽度和高度
    mShapeDrawable = new ShapeDrawable(new PathShape(path1,150,150));

    //得到画笔paint对象并设置其颜色
    mShapeDrawable.getPaint().setColor(Color.BLUE);

    /* 设置图像显示的区域 */
    mShapeDrawable.setBounds(100, 170, 200, 280);

    /* 绘制图像 */
    mShapeDrawable.draw(canvas);
    我想知道,这个梯形的位置是怎么定的,怎么和椭圆的上下对齐的?
      

  6.   


                Path path1 = new Path();
                path1.moveTo(5,  0);
                path1.lineTo(45, 0);
                path1.lineTo(30, 40);
                path1.lineTo(20, 40);
                path1.close();path1不用偏移了,梯形的位置用setBounds设一个偏移就行了好计算。
    mShapeDrawable.setBounds(100, 170, 200, 280);这里计算的宽是100,高是110
    和你new PathShape(path1,150,150)不一样,这里会自动比例缩小。
      

  7.   

    两个设调setBounds的坐标参数就可以对齐了
      

  8.   

    感谢fontlose!
    1、path1设置成这样,是不是还有(5,0)的偏移?这个偏移,有没有相应的缩放比例(如:比例大小是x/100)2、   
           path1.moveTo(150+5, 80+80-50);
            path1.lineTo(150+45, 80+80-50);
            path1.lineTo(150+30, 80+120-50);
            path1.lineTo(150+20, 80+120-50);mShapeDrawable.setBounds(100, 170, 200, 280);梯形的top怎么坐落在y=250上,感觉像是80+170的样子,不知道为什么
      

  9.   

    1.是的 还可以减5最简应该是 
                    Path path1 = new Path();
                    path1.moveTo(0,  0);
                    path1.lineTo(40, 0);
                    path1.lineTo(25, 40);
                    path1.lineTo(15, 40);
                    path1.close();
    2.这个应该在x=255 y=280上吧,两个偏移加上就是了
      

  10.   


    /* 实例化ShapeDrawable对象并说明是绘制一个矩形 */
    mShapeDrawable = new ShapeDrawable(new RectShape());

    //得到画笔paint对象并设置其颜色
    mShapeDrawable.getPaint().setColor(Color.RED);

    Rect bounds = new Rect(5, 250, 55, 280);

    /* 设置图像显示的区域 */
    mShapeDrawable.setBounds(bounds);此梯形和这个矩形平行
    拿y轴来说,是从y=250~280的,当前地方要是简单的相加的话,就变成y=280~320。书上 这么写代码path1.moveTo(150+5, 80+80-50);可能有个好理解的算法
      

  11.   

    学习了 是我想简单了 以梯形为例
    PathShape(path1,150,150)
    mShapeDrawable.setBounds(100, 170, 200, 280);x=100+(200-100)/150*(150+5)
    y=170+(280-170)150*(80+80-50)
    setBounds内的偏移是绝对的 画布上的坐标要乘以放大系数才行