在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-教程,您可以看到更多关于视口概念的信息(它们类似于摄影机对象)。
我希望这能帮上一点忙