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,图形可以显示。请各位帮忙谢谢。
有一个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,图形可以显示。请各位帮忙谢谢。
解决方案 »
- 求教一个Gallery的问题:Gallery里的Item如何居右显示
- 关于Activity全屏显示问题!!!
- 创建项目,老提示required vesion 8
- 问个基础问题关于ONCREAT
- Android SIM认证
- 手机相机扫描程序
- WinXP SP3 下安装 Android SDK,模拟器启动时出现错误...
- android SDK系统源码包中, android/packages/apps 下有许多APK应用, 这个目录下有系统服务吗?
- Android Studio 界面设计和运行的不一样
- 有没有声音对比之类的api?
- android相关 JNI那块
- android自带的计算器(Calculator),核心计算部分在哪儿?怎么改?
通常正方形与圆是最好的方式,越不规则难度越大(特别在处理碰撞的时候)
2:imageView上你确认你的图形画出来了吗,刷新没有/ondraw调用了没有
3:如果画的图属imageView子属性,zoom+-不应担心
有一个空地(有路牌等标识),空地上已存在固定位置的各个场地(就是上图所画的矩形框),每个框可点击进去查看具体内容。我现在的思路是把整个空地保存为一张图片,各个场地已在图片中画出,但为了给这些场地设置事件,所以我会根据坐标在各个场地上画一个透明图层,让这个透明图层产生onclick或ontouch事件。我不知道思路是否正确,请教各位还有没有更好的解决方案。
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[]数组的实际坐标。
x >= x1 , x >= x2的情况,如果把判断条件写成这样,又不复合正常矩形的规则
就和上面图片中的一样,所以无法根据坐标的判断测算。
首先当你画了一些图形 记录一下你需要让其有onclick事件的图形的上下左右 然后在ontouch事件的ondown那里判断手指在那个图形范围内 然后在ontouch事件的手指up事件上 如果手指依然是在同一个图形上up则算是触发了onclick事件 你就在up那里写上如果onclick了就干嘛干嘛了
1、算出矩形四个点的坐标(可以根据旋转的角度求得)
2、当前点击点的坐标(x,y)和(0,y)构成一条线段line0
3、矩形的四个顶点风别构成了四条线段line1、line2、line3、line4
4、求出line0和line1、line2、line3、line4是否相交(判断两条线段是否相交,Java中有现成的实现)
5、如果相交线段的个数为1则点击在了矩形内
如果绘制的矩形区域旋转成一定的角度的话可以用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);
对了,补充一点,ImageView也可以getMatrix,用ImagView跟直接用canvas画出来道理是一样的,invert坐标系就可以了