Android 使用onTouchEvent时无法拖动某些区域
我正在制作一个时间表应用程序。 我现在正在测试onDraw和onTouchEvent的性能 我做了一个自定义视图并绘制了8x10条线。 我覆盖onTouchEvent,如果触摸经过每个矩形,则矩形将填充绿色 如果我从左向右拖动,从上到下拖动,拖动将向右进行,并且每个矩形都填充有颜色。 但当我向后拖动(从右到左,从下到上)时,第一行和最后一行不起作用! 即使我触摸了矩形内的位置,矩形也没有填充颜色 我正在研究我的代码,并试图修复了很多次,但无法解决问题 请查看我的代码并帮助我~Android 使用onTouchEvent时无法拖动某些区域,android,touch-event,ondraw,Android,Touch Event,Ondraw,我正在制作一个时间表应用程序。 我现在正在测试onDraw和onTouchEvent的性能 我做了一个自定义视图并绘制了8x10条线。 我覆盖onTouchEvent,如果触摸经过每个矩形,则矩形将填充绿色 如果我从左向右拖动,从上到下拖动,拖动将向右进行,并且每个矩形都填充有颜色。 但当我向后拖动(从右到左,从下到上)时,第一行和最后一行不起作用! 即使我触摸了矩形内的位置,矩形也没有填充颜色 我正在研究我的代码,并试图修复了很多次,但无法解决问题 请查看我的代码并帮助我~ public cl
public class TimeTableActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
OnDrawing drawing = new OnDrawing(this); //customView
setContentView(drawing);
}
class OnDrawing extends View{
//x,y = first touch position, endX, endY = last touch position
//startX, startY = calculate where to start for filling color.
// stopX, stopY = calculate where to finish for filling color.
float x, y, endX, endY, startX, startY, stopX, stopY;
public OnDrawing(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//Paint Color 1, 2 ,3
Paint paint = new Paint();
paint.setColor(Color.RED);
Paint paint2 = new Paint();
paint2.setColor(Color.YELLOW);
Paint paint3 = new Paint();
paint3.setColor(Color.GREEN);
/***row 10lines***/
for(int i=0; i<11; i++){
canvas.drawLine(0, getHeight()/10*i, getRight(), getHeight()/10*i, paint);
}
/***colum 8lines***/
for(int i=0; i<9; i++){
canvas.drawLine(getWidth()/8*i, 0, getWidth()/8*i, getBottom(), paint);
}
/***first rows background color***/
for(int i=0; i<10; i++){
canvas.drawRect(0, getHeight()/10, getWidth()/8, getBottom(), paint2);
}
/***first column background color***/
for(int i=0; i<8; i++){
canvas.drawRect(getWidth()/8, 0, getRight(), getHeight()/10, paint2);
}
/***first cell color***/
canvas.drawRect(0, 0, getWidth()/8, getHeight()/10, paint3);
/***days in the first line***/
canvas.drawText("Mon", getWidth()/8*1+10, getHeight()/10*1/2, paint);
canvas.drawText("Tue", getWidth()/8*2+10, getHeight()/10*1/2, paint);
canvas.drawText("Wed", getWidth()/8*3+10, getHeight()/10*1/2, paint);
canvas.drawText("Thu", getWidth()/8*4+10, getHeight()/10*1/2, paint);
canvas.drawText("Fri", getWidth()/8*5+10, getHeight()/10*1/2, paint);
canvas.drawText("Sat", getWidth()/8*6+10, getHeight()/10*1/2, paint);
canvas.drawText("Sun", getWidth()/8*7+10, getHeight()/10*1/2, paint);
/***time in the first line***/
canvas.drawText("icon", 10, getHeight()/10*1/2, paint);
canvas.drawText("1", 10, getHeight()/10*1+getHeight()/10*1/2, paint);
canvas.drawText("2", 10, getHeight()/10*2+getHeight()/10*1/2, paint);
canvas.drawText("3", 10, getHeight()/10*3+getHeight()/10*1/2, paint);
canvas.drawText("4", 10, getHeight()/10*4+getHeight()/10*1/2, paint);
canvas.drawText("5", 10, getHeight()/10*5+getHeight()/10*1/2, paint);
canvas.drawText("6", 10, getHeight()/10*6+getHeight()/10*1/2, paint);
canvas.drawText("7", 10, getHeight()/10*7+getHeight()/10*1/2, paint);
canvas.drawText("8", 10, getHeight()/10*8+getHeight()/10*1/2, paint);
canvas.drawText("9", 10, getHeight()/10*9+getHeight()/10*1/2, paint);
canvas.drawText("10", 10, getHeight()/10*10+getHeight()/10*1/2, paint);
canvas.drawRect(startX, startY, stopX, stopY, paint3);//fill background color, from start position to stop position
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
x = event.getX(); //first touch position
y = event.getY();
break;
case MotionEvent.ACTION_MOVE:
endX = event.getX(); //last touch point
endY = event.getY();
if(endX>x && endY>y){ //If Dragging toward right bottom
/***First Touch Position***/
for(int i=0; i<8; i++){
if(x>getWidth()/8*i && x<getWidth()/8*(i+1)){
for(int j=0; j<10; j++){
if(y>getHeight()/10*j && y<getHeight()/10*(j+1)){
startX = getWidth()/8*i; //startX = left side of the cell
startY = getHeight()/10*j; //startY = upside of the cell
}
}
}
}//for
/***Last Touch position***/
for(int i=0; i<8; i++){
if(endX>getWidth()/8*i ){
for(int j=0; j<10; j++){
if(endY>getHeight()/10*j && endY<getHeight()/10*(j+1)){
stopX = getWidth()/8*(i+1); //stopX = right side of the cell
stopY = getHeight()/10*(j+1); //stopY = bottom side of the cell
}
}
}
}//for
if(endX<x && endY<y){ //if dragging toward left top side.(backward) this part is trouble
/***First Touch position***/
for(int i=0; i<8; i++){
if(x>getWidth()/8*i && x<getWidth()/8*(i+1)){
for(int j=0; j<10; j++){
if(y>getHeight()/10*j && y<getHeight()/10*(j+1)){
startX = getWidth()/8*(i+1); //startX = right side of the cell
startY = getHeight()/10*(j+1); //startY = down side of the cell
}
}
}
}//for
/***Last Touch position***/
for(int i=0; i<8; i++){
if(endX>getWidth()/8*i ){
for(int j=0; j<10; j++){
if(endY>getHeight()/10*j && endY<getHeight()/10*(j+1)){
stopX = getWidth()/8*(i); //stopX = left side of the cell
stopY = getHeight()/10*(j); //stopY = upside of the cell
}
}
}
}//for
}
break;
}
invalidate();
return true;
}
}
公共类TimeTableActivity扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
OnDrawing绘图=新建OnDrawing(此);//自定义视图
setContentView(图形);
}
类OnDrawing扩展了视图{
//x、 y=第一次触摸位置,endX,endY=最后一次触摸位置
//startX,startY=计算填充颜色的起始位置。
//stopX,stopY=计算填充颜色的完成位置。
浮点数x,y,endX,endY,startX,startY,stopX,stopY;
公共OnDrawing(上下文){
超级(上下文);
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
//油漆颜色1,2,3
油漆=新油漆();
油漆。设置颜色(颜色。红色);
油漆油漆2=新油漆();
油漆2.setColor(颜色:黄色);
油漆油漆3=新油漆();
油漆3.setColor(颜色为绿色);
/***第10行***/
对于(int i=0;i首先,不要在onDraw函数中创建绘制实例。在构造函数中只声明/创建它们一次,这将提高绘图性能。其次,我无法完全理解您的代码(即数学),但包含拖动功能的一种解决方案可能如下所示:
制作一个点变量,比如:
Point drag_distance_Point = new Point();
关于行动(行动):
drag_distance_Point.set(start.x - end.x, start.y-end.y);
现在将该点添加到矩形或任何要拖动的坐标中。实际上,这将从当前绘制的坐标中添加/减去拖动的坐标。这样,对象将移动/拖动
干杯谢谢你的帮助。你的建议对解决问题非常有帮助。