在android中开发一个类似于简单形状(正方形和圆形)设计师的视图

在android中开发一个类似于简单形状(正方形和圆形)设计师的视图,android,drawing,android-custom-view,Android,Drawing,Android Custom View,你好,我已经为此挣扎了一段时间,试图建立一种设计师,我可以通过点击(或拖动)将一些形状放入其中,问题是我试图理解他们谈论的视口,滚动和拖动来创建图表,尽管我的目标更像是地图设计,大概是这样的: 到目前为止,我已经能够做一些基本的操作,比如当你触摸它时,它会画一个圆并能够进行缩放,但我仍然不理解整个视口、内容和过卷器的组合。你能给我提些建议吗?有人这样做过吗?任何可以简单解释的教程或示例。您可以使用此功能将方形位图更改为圆形位图 public Bitmap getRoundedShape(Bit

你好,我已经为此挣扎了一段时间,试图建立一种设计师,我可以通过点击(或拖动)将一些形状放入其中,问题是我试图理解他们谈论的视口,滚动和拖动来创建图表,尽管我的目标更像是地图设计,大概是这样的:


到目前为止,我已经能够做一些基本的操作,比如当你触摸它时,它会画一个圆并能够进行缩放,但我仍然不理解整个视口、内容和过卷器的组合。你能给我提些建议吗?有人这样做过吗?任何可以简单解释的教程或示例。

您可以使用此功能将方形位图更改为圆形位图

public Bitmap getRoundedShape(Bitmap scaleBitmapImage) {
      // TODO Auto-generated method stub
      int targetWidth = 50;
      int targetHeight = 50;
      Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, 
                                targetHeight,Bitmap.Config.ARGB_8888);

                    Canvas canvas = new Canvas(targetBitmap);
      Path path = new Path();
      path.addCircle(((float) targetWidth - 1) / 2,
      ((float) targetHeight - 1) / 2,
      (Math.min(((float) targetWidth), 
                    ((float) targetHeight)) / 2),
              Path.Direction.CCW);

                    canvas.clipPath(path);
      Bitmap sourceBitmap = scaleBitmapImage;
      canvas.drawBitmap(sourceBitmap, 
                                    new Rect(0, 0, sourceBitmap.getWidth(),
        sourceBitmap.getHeight()), 
                                    new Rect(0, 0, targetWidth,
        targetHeight), null);
      return targetBitmap;
     }
还可以查看
Path
类的这些方法

path.addArc(oval, startAngle, sweepAngle);
path.addOval(oval, dir);
path.arcTo(oval, startAngle, sweepAngle);

如果我正确理解了您的问题,您只需要自定义
视图
,即可在
画布
中绘制对象。你可以阅读更多关于它的内容。一个简单的例子:

public class MyActivity extends Activity {

   public void onCreate(Bundle savedInstanceState) {
      setContentView(R.layout.your_custom_view);
   }
}

public class MyView extends SurfaceView{

    public MyView (Context context, AttributeSet attrs){
        super(context, attrs, 0);
    }

    @Override
    protected void onDraw(Canvas canvas) {
       // Draw here
    }

    @Override
    public boolean onTouch(MotionEvent event){
       // Touch events here
       return true;
    }
}
在布局中
XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.your.package.MyView
        android:id="@+id/joystickView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

   <!-- Right side panel with buttons -->
   <Button ... />

   <Button ... />

   ...
</RelativeLayout>

...
因此,现在您在
活动中有了一个自定义的
视图
,您可以使用
画布
绘制任何需要的内容,并在
onTouch()
事件中获取用户触摸坐标。阅读SO或and中的
onTouch()

你也可以阅读手势,基本上是
MotionEvent.ACTION\u DOWN
是你第一次触摸屏幕的时候,你可以得到你画圆的起始点的坐标。然后
MotionEvent.ACTION\u MOVE
是当你拖动手指时,你可以得到坐标,这样你就可以拖动你之前画的任何东西。拖动时,使用
motionEvent.getRawX()
motionEvent.getRawY()
而不是
motionEvent.getX()
motionEvent.getY()
进行平滑拖动


现在,根据用户触摸屏幕的位置,您可以在该坐标中绘制任何您想要的内容。要在图像中创建右侧面板,您可以在
活动
布局中添加按钮,该布局也保存您的自定义
视图
,因此
活动
的左侧是自定义
视图
,您可以在其中绘制所有内容,左侧是选择要绘制的内容的按钮。

这是一个抽象。这样看:
你的世界就是你正在绘制的地图。
只有它的一部分是可见的,即视图端口内的部分,一个矩形。
滚动时,您正在将视图端口移动到地图的其他部分,这些部分以前可能不可见
如果你想象用一盏小灯看世界地图,你只能看到被照亮的部分
如果你想象在世界地图上放置一个坐标系,这意味着你只能看到(0,0)-(10,10)中的一个
矩形,例如,如果你的透镜尺寸为10。
移动透镜就像移动视口一样。
因此,您需要将真实地图的分辨率(可能比显示器的大小大)
设置为显示的大小以及在滚动时可见的地图部分。
如果您存储所绘制的图片/图像/圆圈的坐标,
您可以轻松计算哪些对象是可见的,以及它们的显示位置
假设您的显示器尺寸为800x400,地图内部尺寸为8000x4000,
您有一个矩形100X100,左下角为0,0,另一个为-200,0。
当视口处于0,0时,可以看到第一个矩形。
向左滚动时,移动的不是地图,而是视口。
当视口移动到50,0时,可以看到矩形的一半。 该计算可以通过使用矩阵对向量进行各种数学变换来完成,并且可能变得相当复杂,但众所周知。
如果您看一看OpenGL ES-教程,您可以看到更多关于视口概念的信息(它们类似于摄影机对象)。
我希望这能帮上一点忙