Android - 如何从主要活动的自定义视图中调用方法?

时间:2017-09-28 14:46:28

标签: java android

我创建了一个自定义视图,它将显示一个圆圈(这个想法是用户可以通过各种方式与此进行交互" ball" 从我的主要活动课程中,我想调整一些"" s"属性,在这种情况下改变其颜色。

我的问题是当我尝试从我的MainActivity类调用各种方法时,没有任何反应(也没有错误,应用程序运行但没有做我想要的),但如果我从CircleView类中执行此操作,它有效(例如在触摸时改变颜色)

这是我的自定义View类(CircleView.java):

public class CircleView extends View {
    private int circleColor = Color.GREEN;
    private Paint paint;

    public CircleView(Context context) {
        super(context);
        init(context, null);
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_SCROLL:
                this.circleColor = setRandomColor();
                invalidate();
                break;
            case MotionEvent.ACTION_DOWN:
                this.circleColor = setRandomColor();
                invalidate();
                break;

        }
        return super.onTouchEvent(event);
    }

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

    private void init(Context context, AttributeSet attrs) {
        paint = new Paint();
        paint.setAntiAlias(true);
    }

    public void setCircleColor(int circleColor) {
        this.circleColor = circleColor;
        invalidate();
    }

    public int setRandomColor() {
        Random random = new Random();
        int randomColor = Color.argb(255, random.nextInt(), random.nextInt(), random.nextInt());
        return randomColor;
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
//...
//someXvalue, someYvalue, someRadius are being set here
//...

        paint.setColor(circleColor);
        canvas.drawCircle(someXvalue, someYvalue, someRadius, paint);
    }
}

这是我的MainActivity.java类:

public class MainActivity extends Activity implements
        GestureDetector.OnGestureListener {

    private GestureDetectorCompat mDetector;      
    CircleView circle;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDetector = new GestureDetectorCompat(this, this);
        circle = new CircleView(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        this.mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent event) {
        return true;
    }  

    @Override
    public boolean onSingleTapConfirmed(MotionEvent event) {
        circle.setCircleColor(circle.setRandomColor(0));
        circle.invalidate();
        return true;
    }
}

我是Android开发的新手,也是Java的新手。我意识到它可能是Context的东西,这是我还没有完全理解的东西。也可能是TouchEvents的东西。我相信那里的人可以看到我的错误。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:5)

您的circle视图不是活动布局的一部分,它只是内存中没有链接到您的活动屏幕的对象所以解决方案

1。)将circle设置为活动视图

  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDetector = new GestureDetectorCompat(this, this);
        circle = new CircleView(this);
        setContentView(circle);
    }

2。)您可以在<yourpackagename.CircleView ...attributes .../>中创建activity_main.xml标记,然后使用findViewById在您的活动中对其进行初始化。

答案 1 :(得分:3)

1)如果您只想点击手势,只需在View上实现onClickListener即可。

2)你实际上并没有在任何地方使用GestureDetector。它的工作方式是为要获取手势的视图设置onTouchListener,并将事件发送到手势检测器。您无法将任何视图的数据发送到检测器,因此它永远不会做任何事情。

3)不是一个奇怪的错误 - 为什么circle.setColor(circle.setRandomColor())?我希望一个名为setXXX的函数实际上设置XXX,而不是以后自己做。不遵循该约定将起作用,但难以进行调试和维护。

编辑:@Pavneet_Singh说的是 - 你的圈子不在任何地方,所以它不会出现在屏幕上。