我有一个活动和一个扩展的View类,它们都使用相同的xml布局。在扩展视图中,我在触摸屏幕上做了一些绘图,并且想要在用户点击屏幕时将触摸的坐标x传递给活动。
到目前为止,我已经使用了getter方法并从活动内部调用它,但它只传递了构造函数的X的初始化值,而不是用户触摸的实际X坐标。
我很确定我错过了一些东西。你能给我一些指示吗?
编辑:正如所建议的那样,我尝试使用公共界面而不是更改,而不是getter练习。这是我的代码:
我的自定义课程:
public class ImageView1 extends View {
Context context;
ArrayList<ViewWasTouchedListener> listeners = new
ArrayList<ViewWasTouchedListener>();
ImageView1 img = (ImageView1) findViewById (R.id.imageView1);
public float x=0;
public float y=0;
public ImageView1(Context context) {
super(context);
this.context=context;
setFocusable(true);
}
public ImageView1(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
setFocusable(true);
}
@Override
public boolean onTouchEvent(MotionEvent event){
switch (event.getAction()){
case (MotionEvent.ACTION_DOWN): {
x = event.getX();
y = event.getY();
for (ViewWasTouchedListener listener:listeners){
Log.d("Touchpoint", String.valueOf(x) +"," + String.valueOf(y));
listener.onViewTouched(x);
}
}
return true;
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
....
}
public void setWasTouchedListener(ViewWasTouchedListener listener){
listeners.add(listener);
}
}
我的主要活动:
public class TargetPractise extends Activity implements ViewWasTouchedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.target_form);
ImageView1 value = new ImageView1(TargetPractise.this);
value.setWasTouchedListener(TargetPractise.this);
}
public void onViewTouched(float x){
Log.d("x",String.valueOf(x));
}
}
我的界面:
public interface ViewWasTouchedListener {
void onViewTouched(float x);
}
我的xml布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.archer.test.ImageView1
android:id="@+id/imageView1"
android:layout_width="300dip"
android:layout_height="300dip"
android:layout_gravity="center_horizontal"
android:background="@drawable/target" >
</android.archer.test.ImageView1>
答案 0 :(得分:4)
定义一个接口并使用回调让活动知道x已经改变。我喜欢这种方法,因为它适用于任何有兴趣了解x何时发生变化的类,而不仅仅是你的活动。想象一下,您添加了一种新类型的视图类,但它还需要知道您的自定义视图何时被触摸(我使用图表以及可以拖动的水平和垂直标度来执行此操作 - 标尺告诉任何感兴趣的人,他们已经更改了)
public Interface ViewWasTouchedListener {
void onViewTouched(float x);
}
在自定义视图中
ArrayList<ViewWasTouchedListener> listeners = new ArrayList<ViewWasTouchedListener>();
...
public void setWasTouchedListener(ViewWasTouchedListener listener){
listeners.add(listener);
}
在您的触摸事件中
for (ViewWasTouchedListener listener:listeners){
listener.onViewTouched(x);
}
在您的活动中:
public class Test extends Activity implements ViewWasTouchedListener {
...
@Override
public void onCreate(Bundle savedInstanceState)
{
...
MyExtendedView customView = (MyExtendedView)findViewById(R.id.myCustomeView);
customView.setWasTouchedListener(this);
...
}
public void onViewTouched(float x){
// do whatever you need to do
}
全部来自内存所以请原谅错别字,你应该通过添加removeViewWasTouchedListener并检查你没有在setViewWasTouchedListener中添加两次相同的监听器来改进视图类。
你可能也想要y,所以只需将它添加到接口定义中。
答案 1 :(得分:0)
你应该覆盖onTouch()试试这个,
@Overrride
public boolean onTouch(View v, MotionEvent event) {
int xPoint = event.getX();
int yPoint = event.getY();
return true;
}
答案 2 :(得分:0)
在得到一些帮助并改变一些事情后,我已经有了我的代码来做我想做的事情:
我的活动:
public class TargetPractice extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final View viewMain;
setContentView((viewMain = View.inflate(this, R.layout.main, null)));
new MyImageView(this, viewMain,
new TargetInterface() {
@Override
public void OnTouchEventDown(float x, float y) {
Log.w("MYPRG", String.format("%f, %f", x, y));
}
});
}
}
我的自定义类:
public class MyImageView extends View implements View.OnTouchListener {
Context context;
private TargetInterface iTarget = null;
public float x=0;
public float y=0;
public float getx() {
return this.x;
}
public MyImageView(Context context, View view, TargetInterface iTarget)
{
super(context);
this.context=context;
this.iTarget=iTarget; // bind TargetInterface
setFocusable(true);
view.setOnTouchListener(this);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
{
x = event.getX();
y = event.getY();
return true;
}
}
return false;
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
....
}
public boolean onTouch(View v, MotionEvent event) {
x = event.getX();
y = event.getY();
iTarget.OnTouchEventDown(x, y);
return false;
}
}
我的界面:
public interface TargetInterface {
public void OnTouchEventDown(float x, float y);
}