在Android中开发一个像设计师一样简单形状(正方形和圆形)的视图

3

你好,我一直在努力构建一种设计师,可以通过点击(或拖动)将一些形状放入其中。问题是,我试图理解他们谈论的触摸手势,它们涉及视口、滚动和拖动来创建图表,但我想要的是更像地图设计的东西,就像这样:

enter image description here

到目前为止,我已经能够做一些基本的东西,例如当你触摸屏幕时会绘制一个圆形并且可以缩放,但是我仍然不理解整个视口(viewport)、内容(content)和OverScroller的组合。您能给我一些建议吗?有人做过这个吗?有没有简单易懂的教程或示例可以解释这个问题。
3个回答

0
您可以使用此函数将正方形位图转换为圆形位图。
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);

0
如果我正确理解您的问题,您所需要的只是一个自定义View来在Canvas中绘制对象。您可以在这里阅读更多相关信息。以下是一个简单的示例:
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>

现在您在Activity中拥有自定义的View,可以使用Canvas绘制任何内容,并在onTouch()事件中获取用户触摸坐标。在SO或这里这里阅读有关onTouch()的信息。

您还可以阅读这里关于手势的内容,基本上MotionEvent.ACTION_DOWN是您第一次触摸屏幕时,您可以获取绘制圆形等初始点的坐标。然后MotionEvent.ACTION_MOVE是当您拖动手指时,您可以获取坐标,以便您可以拖动之前绘制的任何内容。在拖动时,请使用motionEvent.getRawX()motionEvent.getRawY()而不是motionEvent.getX()motionEvent.getY()以获得平滑的拖动效果。

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


0
这是一个抽象概念。可以这样理解:
你的世界就像你正在绘制的地图。
只有部分区域是可见的,即在你的视口内的矩形区域。
当你滚动时,你实际上是将你的视口移动到地图的其他部分,这些部分以前可能是不可见的。
如果你想象一下用一个小灯光来看世界地图,你只能看到被照亮的部分。
如果你在世界地图上放置一个坐标系,这意味着你只能看到从(0,0)到(10,10)的矩形区域,例如,如果你的镜头大小为10。
移动你的镜头就像移动你的视口一样。
因此,你需要将你的真实地图(可能比你的显示器尺寸大)的分辨率转换为显示的尺寸和滚动后可见的地图部分的尺寸。
如果你存储了你正在绘制的图片/图像/圆的坐标,你可以轻松地计算出哪些对象是可见的,以及它们应该在哪里显示。
假设你的显示器尺寸为800x400,你的地图尺寸在内部为8000x4000,你有一个左下角坐标为0,0,另一个坐标为-200,0的100x100矩形。
当你的视口在0,0时,你可以看到第一个矩形。
向左滚动时,你实际上是移动你的视口而不是地图。
当你的视口被移动到50,0时,你可以看到矩形的一半。
这个计算可以通过对向量进行各种数学变换来完成,使用矩阵可能会变得相当复杂,但是这些方法已经很成熟了。
如果你查看OpenGL ES教程,你可以更多地了解视口的概念(它们类似于相机对象)。
希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接