从扩展视图发送值到Main

时间:2014-11-02 10:45:47

标签: android view multi-touch

我有这项活动检测Multi-Touch并计算设备被点击3次的每个实例。我想要的是在Main中检查它是否达到已经设置的限制。

主要活动

package com.test.multitouch;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {



@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}
// DETECT more than 20 counts here and display a toast

} 

扩展视图的自定义视图

package com.test.multitouch;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;    
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

@SuppressLint("ClickableViewAccessibility")
public class custom_view extends View {

private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

final int MAX_NUMBER_OF_POINT = 4;
float[] x = new float[MAX_NUMBER_OF_POINT];
float[] y = new float[MAX_NUMBER_OF_POINT];
boolean[] touching = new boolean[MAX_NUMBER_OF_POINT];
int count = 0;

long cur = System.currentTimeMillis();
long dur = 30000;
long fut = cur + dur;

public custom_view(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

public custom_view(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public custom_view(Context context) {
    super(context);
    init();
}

void init() {
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(40);
}

@Override
protected void onDraw(Canvas canvas) {
    for (int i = 0; i < MAX_NUMBER_OF_POINT; i++) {
        if (touching[i]) {
            switch (i) {
            case 1:
                paint.setColor(Color.BLUE);
                break;
            case 2:
                paint.setColor(Color.RED);
                break;
            case 3:
                paint.setColor(Color.YELLOW);
                break;
            case 4:
                paint.setColor(Color.GREEN);
                break;
            }
            canvas.drawCircle(x[i], y[i], 70f, paint);
        }
    }
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
            MeasureSpec.getSize(heightMeasureSpec));
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = (event.getAction() & MotionEvent.ACTION_MASK);
    int pointCount = event.getPointerCount();


    if (pointCount > 3) {
        Log.i("LOG", "register multi touch");

        count++;

        if (count > 20) {

            //SEND BACK TO MAIN TO SAY IT HAS BEEN ACHIEVED

        }

    }

    for (int i = 0; i < pointCount; i++) {
        int id = event.getPointerId(i);

        if (id < MAX_NUMBER_OF_POINT) {

            x[id] = (int) event.getX(i);
            y[id] = (int) event.getY(i);

            if ((action == MotionEvent.ACTION_DOWN)
                    || (action == MotionEvent.ACTION_POINTER_DOWN)
                    || (action == MotionEvent.ACTION_MOVE)) {

                touching[id] = true;
            } else {
                touching[id] = false;
            }
        }
    }
    invalidate();
    return true;
}
}

1 个答案:

答案 0 :(得分:0)

您的自定义视图会引用其附加的上下文。我假设此视图正在您尝试引用的同一活动中运行。您可以按如下方式获取对活动的引用:

    MainActivity mainActivity = (MainActivity) custom_view.this.getContext();

我还假设你是在onTouchListener中调用它。你需要引用“this”来获取outterclass实例,否则这将引用你的onTouchListener类的实例。此外,您应该大写类名,因此您可以从大写中识别出我们是指实例还是类定义。

获得引用后,可以在main Activity上调用一些函数来更新它。

    mainActivity.callSomeFunction();