- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个名为 CanvasView
的自定义 View 。这个 View 允许我在 onDraw
方法之外在其上绘制内容。它是这样的:
public class CanvasView extends View {
private ArrayList<Shape> shapes;
private Paint paint;
public CanvasView (Context c) {
super(c);
init ();
}
public CanvasView(Context context, AttributeSet attrs) {
super (context, attrs);
init ();
}
public CanvasView(Context context, AttributeSet attrs, int defStyleAttr) {
super (context, attrs, defStyleAttr);
init ();
}
private void init () {
shapes = new ArrayList<> ();
paint = new Paint ();
paint.setStrokeWidth (5);
paint.setColor (Color.BLACK);
}
//focus on this method, I think the others are irrelevant
@Override
public void setOnTouchListener (final OnTouchListener listener) {
final OnTouchListener baseListener = new OnTouchListener () {
@Override
public boolean onTouch(View v, MotionEvent event) {
float x = event.getX ();
float y = event.getY ();
if (x < 18 || x > getWidth () - 18 || y < 18 ||
y > getHeight () - 18)
return false;
return true;
}
};
super.setOnTouchListener (new OnTouchListener () {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (baseListener.onTouch (v, event)) {
if (listener != null) {
return listener.onTouch (v, event);
} else {
return true;
}
}
return false;
}
});
}
@Override
protected void onDraw (Canvas c) {
super.onDraw (c);
for (Shape s : shapes) {
s.draw (c);
}
//draw the border. irrelevant
c.drawLine (3, 3, getWidth () - 3, 3, paint);
c.drawLine (3, getHeight () - 3, getWidth () - 3, getHeight () - 3, paint);
c.drawLine (3, 3, 3, getHeight () - 3, paint);
c.drawLine (getWidth () - 3, 3, getWidth () - 3, getHeight () - 3, paint);
//draw the inner border
c.drawLine (18, 18, getWidth () - 18, 18, paint);
c.drawLine (18, getHeight () - 18, getWidth () - 18, getHeight () - 18, paint);
c.drawLine (18, 18, 18, getHeight () - 18, paint);
c.drawLine (getWidth () - 18, 18, getWidth () - 18, getHeight () - 18, paint);
}
public void addShape (Shape s) {
shapes.add (s);
}
public void clear () {
shapes.clear ();
}
}
说明:
Shape
是一个带有方法的接口(interface):
public void draw (Canvas c);
重点关注 setOnTouchListener
覆盖。我重写了这个方法,因为我想限制用户不触摸 CanvasView 的边框。如您所见,我首先调用 baseListener
来检查触摸是否在范围内。然后我调用构造函数中传递的监听器。这是一个好的做法吗?
无论如何,我在onCreate
方法中设置了CanvasView
的OnTouchListener
:
canvas.setOnTouchListener (new View.OnTouchListener () {
@Override
public boolean onTouch(View v, final MotionEvent event) {
if (point1 != null && point2 != null) {
throw new IllegalStateException ("Both point1 and point2 are not null");
}
if (point1 == null) {
point1 = new PointF (event.getX (), event.getY ());
} else { //point2 is null
point2 = new PointF (event.getX (), event.getY ());
canvas.addShape (new Shape () {
@Override
public void draw(Canvas c) {
c.drawLine (point1.x, point1.y, point2.x, point2.y, paint);
}
});
canvas.setOnTouchListener (null);
}
canvas.addShape (new Shape () {
@Override
public void draw(Canvas c) {
c.drawCircle (event.getX (), event.getY (), 13, paint);
}
});
return true;
}
});
说明:
point1
和 point2
是在 Activity 类中声明的字段。当用户触摸屏幕时,其中一个将被实例化,并在该点绘制一个小圆圈。当用户第二次触摸时,point2
被实例化,并在两点之间绘制一条线。
当我运行我的应用程序并触摸屏幕时,没有绘制任何内容!我认为 setOnClickListener
重写编写不正确。谁能告诉我为什么?
最佳答案
View 的 onDraw
方法仅在首次创建 View 时调用。要使其再次被调用,每次 View 的内容发生更改时,您都需要使用 View 上的 invalidate()
函数将 View 标记为“脏”(已进行更改)。
因此,调用此函数的一个方便位置是在 addShape
函数中向 View 添加形状之后。
public void addShape (Shape s) {
shapes.add (s);
this.invalidate();
}
关于java - 为什么没有为我设置 OnTouchListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32918272/
你好 我在我的应用程序中为 ImageView 设置了一个 onTouchListener,我的目标是拥有一个 ImageView,用户可以在应用程序中四处拖动并放置他们想要的任何位置。 我已经使用在
我正在开发一个钢琴应用程序,它不是最好的,但它是一个开始。 我使用下面的代码来播放声音并通过触摸事件更改按钮的图像。 C4.setOnTouchListener(new View.On
请看下面的代码 XML 代码 Java 代码 package k.k; import java.util.ArrayList; import
对于我正在开发的应用程序,我需要使用 OntouchListeners,以便按钮的透明区域不可单击,但这引发了我没有预料到的问题。当我按下按钮时,每次都会存储多个值。 这是我的代码: private
我正在开发一个名为 CanvasView 的自定义 View 。这个 View 允许我在 onDraw 方法之外在其上绘制内容。它是这样的: public class CanvasView exten
好的,伙计们,好吧...,好像我在上一个问题中错了... 我正在开发一个单词搜索游戏,我已经将我的应用程序实现的“视点”从 GridView 更改为在 android 中使用 Canvas 绘制位图。
我有一个附加了 onTouchListener 的文本字段。当我触摸文本时,ACTION_DOWN 被触发,文本从默认的白色变为黑色。然后我取消触摸 ACTION_UP 被触发,文本变回白色。 但是现
最初我通过 XML 将我的按钮连接到一个方法,如下所示: 然后我决定添加一个 onTouchListener 以便我可以处理 ACTION_UP 事件: private OnTouc
代码: public class ImageActivity extends FragmentActivity { ImageView mClickedImage; PhotoView
brown = (Button) findViewById(R.id.brownButton); brown.setOnTouchListener(new OnTouchListener()
我制作了一个自定义 View ,它具有 OnTouchEvent(MotionEvent event) 方法。这使得 View 在按下时改变颜色。 我还为我的 Activity 实现了一个 OnTou
我想创建自己的 OnTouchListener。然后我想将它封装到一个 .jar 文件中以使其可重用。 这是我的特定 OnTouchListener: public class TouchableVi
我正在尝试在 spinner 上设置 OnTouchListner。能够在自定义 View 上调用它,但不能在微调器上调用。 还尝试使用 MotionEvent.ACTION_DOWN。代码不适用于
Falks,这将是一个愚蠢的错误,但我真的猜不出它在哪里。 我正在尝试设置 OnTouchListener,但未调用方法 onTouch。 这是我的代码: public class StepA
我对 OnTouchListener 有疑问。我创建了一个自定义按钮。此按钮与 onClick 事件 一起正常工作。但它不适用于 onTouch 事件 这是我的自定义按钮。我只想要按钮和按钮按下这两个
我正在创建一个像 Facebook 聊天头一样的小弹出窗口。 气泡启动并出现,但 ontouchlistener 没有响应 ontouch 事件做了我测试时应该做的事情,但当我集成它时,它没有触发 下
我有一个 OnTouchListener,但是当我实际测试我的程序并触摸屏幕时,显示的颜色不是应有的颜色。我使用颜色 block 进行了测试,它可以工作,但是坐标仍然关闭,如果您在一种颜色上触摸得太远
我的图像移动得很奇怪,并且在我需要它保持连续的时候随机暂停。它停止然后工作。如果您可以提高效率,请发帖。还要看看是否有办法缩短代码。 import android.support.v7.app.App
我有一个按钮(代码中的变量 theButton),并且希望能够将它拖到它的父 View 周围。这是它的 OnTouchListener: OnTouchListener touchBListe
您好,我构建了一个具有根相对布局 View 的应用程序。我试图设置一个触摸监听器以在用户触摸屏幕时返回,但它似乎没有触发,我不知道我哪里出错了。我在网上搜索和查看,但据我所见,似乎每个人都使用与我相同
我是一名优秀的程序员,十分优秀!