Android 在LinearLayout扩展类中绘制一条线
我有这门课: 我的问题是:Android 在LinearLayout扩展类中绘制一条线,android,android-layout,android-canvas,Android,Android Layout,Android Canvas,我有这门课: 我的问题是: public class Example extends Activity implements OnClickListener{ DrawView view1; Canvas canvas = new Canvas(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); view1
public class Example extends Activity implements OnClickListener{
DrawView view1;
Canvas canvas = new Canvas();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view1 = new DrawView(this);
setContentView(view1);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
view1.setFirstCoord(x, y);
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
view1.setSecondCoord(x, y);
view1.dispatchDraw(canvas);
break;
}
return true;
}
public class DrawView extends LinearLayout {
private Paint paint = new Paint();
public int x1, x2;
public int y1, y2;
public DrawView(Context c){
super(c);
LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
addView(inflater.inflate(R.layout.union, null));
x1 = 0;
x2 = 0;
y1 = 0;
y2 = 0;
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setDither(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(10);
}
@Override
public void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
canvas.drawLine(0, 50, 900,2000 , paint);//WORKS
canvas.drawLine((int) x1, (int) y1,(int) x2,(int) y2, paint);//NO WORKS
}
public void setFirstCoord(int e, int f){
x1 = e;
y1 = f;
}
public void setSecondCoord(int e, int f){
x2 = e;
y2 = f;
}
}
}
当执行下一行时,我在屏幕上看到“示例”行:
canvas.drawLine(0, 50, 900,2000 , paint);
但当下面这一行“被执行”时,它并没有画出任何直线。为什么
canvas.drawLine((int) x1, (int) y1,(int) x2,(int) y2, paint);
我还尝试了:
canvas.drawLine(x1, y1, x2, y2, paint);
但是,很明显,结果是一样的
我还尝试了执行一个onDraw()方法,但是任何一行都会被绘制,因为onDraw绘制在de“UI”下(在layout.xml文件的内容下)
我希望能找到能帮助我的人。我认为解决办法很简单,但我会发疯,在没有找到解决办法的情况下尝试
谢谢
解决方案:
public class Example extends Activity implements OnClickListener{
DrawView view1;
Canvas canvas = new Canvas();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view1 = new DrawView(this);
setContentView(view1);
view1.setOnClickListener(this);
}
public class DrawView extends LinearLayout {
private Paint paint = new Paint();
public int x1, x2;
public int y1, y2;
public DrawView(Context c){
super(c);
LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
addView(inflater.inflate(R.layout.union, null));
x1 = 0;
x2 = 0;
y1 = 0;
y2 = 0;
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setDither(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(10);
}
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
view1.setFirstCoord(x, y);
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
view1.setSecondCoord(x, y);
view1.onDraw(canvas);
view1.postInvalidate();
break;
}
return true;
}
public void setFirstCoord(int e, int f){
x1 = e;
y1 = f;
}
public void setSecondCoord(int e, int f){
x2 = e;
y2 = f;
}
public void onDraw(Canvas canvas){
canvas.drawLine((int) x1, (int) y1,(int) x2,(int) y2, paint);
}
}
}
再次感谢您的帮助和关注。很荣幸 如果要为此使用OnClickListener接口,需要将活动设置为视图的
OnClickListener
:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view1 = new DrawView(this);
setContentView(view1);
// Add this:
view1.setOnClickListener(this);
}
否则,onTouchEvent
将永远不会被调用
另外,
ontochevent
应命名为onClick
而不是将绘图代码放入dispatch draw,请尝试将其放入onDraw
然后修改onTouch方法,使其如下所示:
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
view1.setFirstCoord(x, y);
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
view1.setSecondCoord(x, y);
view1.postInvalidate();
break;
}
return true;
}
- 将OnTouchEvent移动到DrawView,而不是活动
- 使DrawView扩展视图,而不是线性布局
- 代替dispatchDraw,实现onDraw方法,并在onTouchEvent中调用invalidate()
您可能应该在视图中而不是在活动中接收touchevent,然后touchevent和画布绘制的坐标系都将相同。我注意到您正在实现OnClickListener,请理解,任何OnClickListener都会使用触摸事件,阻止它到达活动的
onTouchEvent()
方法。您是否验证了调用了onTouchEvent()
?如果您的答案只是“执行X而不是Y”,那么解释断言背后的原因会有所帮助。如果OP想要绘制线性布局,而不仅仅是普通视图,该怎么办?如果我使用DrawView扩展视图,而不是线性布局,我不知道如何加载布局文件.xml。但别担心;)在你和其他朋友的帮助下,我解决了我的问题。我现在就写解决方案。谢谢当我画一条线时,这条线是在Y轴上绘制的。X坐标是完美的。我认为这没有任何解释或意义。我必须减去一个Y坐标。这可能是因为布局?因为我混合了线性布局和相对布局。谢谢当我画一条线的时候,这条线是在Y轴上移动的。X坐标是完美的。我认为这没有任何解释或意义。我必须减去一个Y坐标。这可能是因为布局?因为我混合了线性布局和相对布局。谢谢