1.介绍
  有一个ImageView,根据坐标数组在ImageView上画出图形,每个图形都有一个onclick事件。
 
  Activity代码:
  Activity.java
  package com.example.floorexhibitiontest;
  import com.floor.DrawView;
  import android.app.Activity;
  import android.os.Bundle;
  import android.widget.LinearLayout;
  public class HallActivity extends Activity
 {
       @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hall);
        }        float[][][] points = new float[][][]{
{
{213,264},
{247,232},
{345,338},
{310,371}
},
{
{171,305},
{205,272},
{302,373},
{267,406}
},
{
{571,320},
{606,320},
{606,428},
{571,428}
}};         LinearLayout layout = (LinearLayout)findViewById(R.id.root);
         final DrawView draw = new DrawView(this,points);
         layout.addView(draw);
         
 } DrawView代码
DrawView.java
package com.floor;
import com.example.floorexhibitiontest.R;import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Path;
import android.graphics.Paint.Style;
import android.graphics.Shader.TileMode;
import android.graphics.Shader;
import android.util.DisplayMetrics;
import android.view.View;public class DrawView extends View{
    private float[][][] points = null;
    DisplayMetrics metric = new DisplayMetrics();    public DrawView(Context context,float[][][] p) {
super(context);
metric = context.getApplicationContext().getResources().getDisplayMetrics();
points = p;
}       @Override
protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
                float density=metric.density;                  for(int i = 0; i < points.length; i++){
Paint p = new Paint();
p.setAntiAlias(true);
p.setColor(Color.BLUE);
                        Path path=new Path();
path.moveTo(points[i][0][0] / density, points[i][0][1] / density);
path.lineTo(points[i][1][0] / density, points[i][1][1] / density);
path.lineTo(points[i][2][0] / density, points[i][2][1] / density);
path.lineTo(points[i][3][0] / density, points[i][3][1] / density);

path.close();
p.setStyle(Style.STROKE);
                        canvas.drawPath(path, p);
                }
        }
    
}
目前效果
问题:
1.怎么让画出的每个矩形产生自己的onclick事件
2.LinearLayout layout = (LinearLayout)findViewById(R.id.root) 这句代码,
  这个布局文件中有个ImageView,我的目的就是要把图形画到这个ImageView上,但显示的效果是ImageView显示,则画出的图形无法显示,可能是被遮盖。如果隐藏ImageView,图形可以显示。请各位帮忙谢谢。

解决方案 »

  1.   

    另外,在上面画出的图形可以同步跟随ImageView放大缩小。
      

  2.   

    1:关于click你得添加touch监听事件,根据坐标点(x,y)来判断是否是点中
    通常正方形与圆是最好的方式,越不规则难度越大(特别在处理碰撞的时候)
    2:imageView上你确认你的图形画出来了吗,刷新没有/ondraw调用了没有
    3:如果画的图属imageView子属性,zoom+-不应担心
      

  3.   

    最简单的思路就是franzhong说的,基本上是面向过程的做法。当然,如果你想可复用,就得自己构建一堆UI组件(也就是customView)。每个图形也就是一个组件。每个组件当然都有监听按键的接口。父VIEW接收到按键事件之后,把事件传递给每个组件,有处理的,返回TREU则结束,否则继续传递事件。
      

  4.   

    我现在的做法是把循环的代码放到activity中,也就是说,根据数组,返回N个DrawView对象,并且DrawView对象中设置了onClick和onTouch事件,但加载到界面上的事件,只记录了最后一个数组的参数值,并且点击效果是整个屏幕有效,而不是一个矩形框有效
      

  5.   

    本身的项目需求是这样的:
    有一个空地(有路牌等标识),空地上已存在固定位置的各个场地(就是上图所画的矩形框),每个框可点击进去查看具体内容。我现在的思路是把整个空地保存为一张图片,各个场地已在图片中画出,但为了给这些场地设置事件,所以我会根据坐标在各个场地上画一个透明图层,让这个透明图层产生onclick或ontouch事件。我不知道思路是否正确,请教各位还有没有更好的解决方案。
      

  6.   

    试一下这个:
    public boolean onTouch(View v, MotionEvent event) {
       if((event.getX(0)>=x_coord) && 
          (event.getY(0)>=y_coord) && 
         ( event.getX(0)<=x_coord + your_rectangle_width) && 
          (event.getY(0)<=y_coord + your_rectangle_heigth))
          {
              //rectangle selected
          }
       return true;
    }
    或者使用onTouch()在points[]数组的实际坐标。 
      

  7.   

    谢谢,不过我画出的图形有可能是斜的,会出现
    x >= x1 , x >= x2的情况,如果把判断条件写成这样,又不复合正常矩形的规则
    就和上面图片中的一样,所以无法根据坐标的判断测算。
      

  8.   

    onclick事件用ontouch事件来实现  
    首先当你画了一些图形   记录一下你需要让其有onclick事件的图形的上下左右   然后在ontouch事件的ondown那里判断手指在那个图形范围内  然后在ontouch事件的手指up事件上 如果手指依然是在同一个图形上up则算是触发了onclick事件  你就在up那里写上如果onclick了就干嘛干嘛了  
      

  9.   

    给你说下大概的思路
        1、算出矩形四个点的坐标(可以根据旋转的角度求得)
        2、当前点击点的坐标(x,y)和(0,y)构成一条线段line0
        3、矩形的四个顶点风别构成了四条线段line1、line2、line3、line4
        4、求出line0和line1、line2、line3、line4是否相交(判断两条线段是否相交,Java中有现成的实现)
        5、如果相交线段的个数为1则点击在了矩形内
      

  10.   

    这个我弄过,不过没用ImageView,用canvas画出来的
    如果绘制的矩形区域旋转成一定的角度的话可以用Matrix矩阵处理,里面有个mapPoints对点进行坐标系的转换,从而计算出最终的结果,当然画图的时候也要用Matrix,反正矩阵是个好东西,哈哈!在onTouchEvent()下 float tx = event.getX();
    float ty = event.getY();
    float[] dst = new float[2];
    float[] src = { tx, ty };
    Matrix matrix = new Matrix();
    if (object.getMatrix().invert(matrix)) {
    matrix.mapPoints(dst, src);
    }
    matrix.mapPoints(dst, src);
      

  11.   


    对了,补充一点,ImageView也可以getMatrix,用ImagView跟直接用canvas画出来道理是一样的,invert坐标系就可以了
      

  12.   

    不妨看看我的博客 http://blog.csdn.net/dylan465/article/details/8351007
      

  13.   

    这种方式感觉可以,不晓得撸主有没有研究过android自带的Calendar,那里面的每个小单元格其实都是通过对所触摸的区域进行判断检查被触摸的区域是否允许有事件发生的。
      

  14.   

    重写dispatchTouchEvent(MotionEvent event)这个方法。在写个回调方法就可以了