Android用户用手指画线条
我想在Android上建立一个工具,用户可以在图片上绘制一些简单的对象(如线、圆或箭头)。我首先开始尝试线条部分,事实上我可以成功地画出它。逻辑是,用户在一个点上轻敲,然后拖动手指,绘制线条。我使用这样的类(它基于): 从活动代码中,我使用onTouch侦听器,如下所示:Android用户用手指画线条,android,android-canvas,draw,touch-event,ontouchlistener,Android,Android Canvas,Draw,Touch Event,Ontouchlistener,我想在Android上建立一个工具,用户可以在图片上绘制一些简单的对象(如线、圆或箭头)。我首先开始尝试线条部分,事实上我可以成功地画出它。逻辑是,用户在一个点上轻敲,然后拖动手指,绘制线条。我使用这样的类(它基于): 从活动代码中,我使用onTouch侦听器,如下所示: @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case M
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Sx1 = event.getX();
Sy1 = event.getY();
return true;
case MotionEvent.ACTION_MOVE:
Cx1 = event.getX();
Cy1 = event.getY();
drawLine();
return true;
case MotionEvent.ACTION_UP:
Lx1 = event.getX();
Ly1 = event.getY();
return true;
}
return false;
}
public void drawLine(){
setContentView(R.layout.show);
ImageView myImage = (ImageView) findViewById(R.id.lastphoto);
myImage.setImageBitmap(rotatedPic);
dv=new DrawView(this, Sx1, Sy1, Cx1, Cy1);
addContentView(dv, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT));
RelativeLayout mRelativeLayout = (RelativeLayout) findViewById(R.id.linear);
mRelativeLayout.setOnTouchListener((OnTouchListener) this);
mRelativeLayout.addView(new Drawer(this));
}
每次移动时,我都会重新创建整个视图,这样从起点到终点只有一条线是可见的。我首先担心的是,我不知道这个实现是否正确。此外,我希望这些线在创建后作为对象处理。用户应该能够移动、旋转、删除等。我认为我可以通过在缓冲区中保持每行边的坐标来实现这一点,如果用户点击非常接近一条边,我可以处理该手势。但所有这些听起来都太复杂了,我不知道这是否不稳定
我是否应该使用一些不同的方法来实现我完全不知道的东西?在我看来,存储绘制的线条并让用户能够操纵它们只是稍微复杂一些 创建一个Line类。包括开始和结束坐标、颜色等作为类的字段以及要删除、移动等的方法。还添加了一个采用MotionEvent参数的方法。在这种方法中,您可以使用MotionEvent来确定该线是否已被触摸,并根据需要调整其位置 在扩展视图类的集合或某种列表中存储对绘制的每条线(创建为line类的实例)的引用,ArrayList应该这样做。然后,在onTouch事件中,调用每行的触摸检测方法,并将MotionEvent传递给这些方法 最后,通过迭代对行实例的引用集合,重写视图的onDraw回调以绘制每一行 您还可以添加更多的手势,如长按删除等。下面是这种方法的(完全未经测试,从内存中编写)框架
class Line
public float x1, x2, y1, y2;
public void detectTouch(MotionEvent motionEvent){
// code to detect a touch and adjust the x and ys accordingly
}
class DrawView extends View{
private ArrayList<Line> lines = new ArrayList<Lines>();
....
....
@Override
public void onDraw(Canvas canvas) {
super.onDraw();
for (Line line : lines){
canvas.drawLine(line.x1,line.y1,line.x2,line.y2);
}
}
@Override
public boolean onTouch(View view, MotionEvent event) {
....
....
for (Line line : lines){
line.detectTouch(MotionEvent);
}
}
类行
公众浮标x1、x2、y1、y2;
公共无效检测按钮(MotionEvent MotionEvent){
//编码以检测触摸并相应调整x和ys
}
类DrawView扩展了视图{
私有ArrayList行=新建ArrayList();
....
....
@凌驾
公共空白onDraw(画布){
super.onDraw();
用于(行:行){
帆布画线(线x1,线y1,线x2,线y2);
}
}
@凌驾
公共布尔onTouch(视图、运动事件){
....
....
用于(行:行){
line.detectTouch(运动事件);
}
}
玩得开心!你的实现很奇怪。要实现这样一个程序,你需要一个
视图
,覆盖它的onDraw
方法,处理用户的拖动动作,并调用视图。invalidate()
相应地。您的意思是创建一个扩展view的对象?就像我作为绘制类使用的DrawView?但是对该对象的实例调用invalidate不会删除以前的行。您是否有指向某个示例的链接,以便我能理解您的意思?这看起来很有希望,谢谢!我会尝试并让您知道根据你的建议,我成功地使它工作得非常好,直到现在!非常感谢!嘿,乔治。很高兴听到它的帮助。祝你好运,,,嘿,你能给出演示的完整代码吗..要从左到右移动动画,在左边添加新行..我想这样发展::
class Line
public float x1, x2, y1, y2;
public void detectTouch(MotionEvent motionEvent){
// code to detect a touch and adjust the x and ys accordingly
}
class DrawView extends View{
private ArrayList<Line> lines = new ArrayList<Lines>();
....
....
@Override
public void onDraw(Canvas canvas) {
super.onDraw();
for (Line line : lines){
canvas.drawLine(line.x1,line.y1,line.x2,line.y2);
}
}
@Override
public boolean onTouch(View view, MotionEvent event) {
....
....
for (Line line : lines){
line.detectTouch(MotionEvent);
}
}