【问题标题】:Drawing touchable layers with android使用 android 绘制可触摸层
【发布时间】:2012-11-20 20:20:24
【问题描述】:

我想创建一个简单的绘图应用程序。我希望能够添加一些线条、圆形和矩形。我想选择任何形状并移动它。 我试过这种方式:
- 为每个形状添加一个视图,并在视图的 onDraw 方法中绘制形状
- 将每个视图添加到相对布局中

我可以看到所有的形状,但我只能触摸第一个视图,因为它填满了整个屏幕。 我在示例中搜索了一个“分层”应用程序的示例,但没有成功

谢谢 :)

编辑:添加代码。
如果我点击矩形,我可以看到日志,但如果我点击圆圈,则没有日志。

编辑 2 :哎呀,我忘了在圈子里附加听者... :( 抱歉

布局:

public class DrawingView extends RelativeLayout {

  public DrawingView(Context context) {
      super(context);
      this.setBackgroundColor(0xFFFFFFFF);
      this.addView(new Circle(context));
      this.addView(new Rectangle(context));
  }
}

圆:

public class Circle extends View implements View.OnTouchListener {

    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

    public Circle(Context context) {
        super(context);
        this.paint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        this.setMeasuredDimension(100, 100);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(50, 50, 50, this.paint);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.d("myApp", "cercle");
        return false;
    }

}

还有矩形:

public class Rectangle extends View implements View.OnTouchListener {

    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);


    public Rectangle(Context context) {
        super(context);
        this.paint.setStyle(Paint.Style.STROKE);
        this.setOnTouchListener(this);
        this.setX(50);
        this.setY(50);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        this.setMeasuredDimension(100, 100);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(0, 0, 100, 100, this.paint);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.d("myApp", "Rectangle");
        return false;
    }

}

【问题讨论】:

  • android 怎么能区分触摸顶层和“哦,这个人一定很想触摸底层的第三层”?
  • 嗯,这是讽刺。使用 flash 非常简单,我只需为每个形状添加一个“剪辑”并在其上附加一个侦听器。
  • 为什么视图会填满屏幕?如果您正确设置尺寸,则不会。
  • 感谢您的回答。我用调用“setMeasuredDimension”的“onMeasure”修复了视图的尺寸,更好的是,在整个屏幕上没有检测到点击,只有在第一个视图中。但是我第二个视图的onTouch方法还是没有调用
  • 我已经添加了代码,你能看到错误吗?

标签: android


【解决方案1】:

您想在同一个视图中创建您的形状。使用 ShapeDrawable 包装器,并在创建时将每一个放入同一个数组列表中。然后检查arraylist中的位置,以确定它们在重叠时要移动的形状。

【讨论】:

  • 感谢您的回答。如何检查用户单击的形状?无法将侦听器附加到形状上。要我从事件的坐标推导出来吗?
  • 目前我面前没有 API,但是基于,但我认为 drawable 应该有获取坐标和/或边界的方法。因此,您将希望您的 ontouch 从末端运行数组并检查坐标。
  • 好的,谢谢你的提议,如果没有其他解决方案,我就这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2012-08-29
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多