如何使自定义视图从活动中失效

时间:2011-08-27 18:25:15

标签: java android custom-view

我有一个应用程序,我想在位图上放置2个圆圈。我有2个按钮,一个用于增加半径,另一个用于减小半径。按钮在活动中从xml中膨胀。活动的视图是自定义视图。我可以在视图上显示按钮,并相应地改变半径变量。到现在为止还挺好。单击任一按钮时,我无法使视图无效。应该发生什么,是当单击按钮时,半径被更改,然后画布重新绘制以显示半径变化。如何从onclick()调用invalidate?我不确定这是否是最好的方法。谢谢。

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Jjilapp extends Activity {




    private static final String TAG = "*********jjil";


    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.touchview);
        final TouchView touchView = (TouchView)findViewById(R.id.touchview); 
        final HorizontalSlider slider = (HorizontalSlider)findViewById(R.id.slider); 
        touchView.initSlider(slider);

        Button plus = (Button)findViewById(R.id.plus);
        plus.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Log.e(TAG, "onClickplus");
                TouchView.setRadius(TouchView.getRadius() + 5);
                Log.e(TAG, "radius = "+TouchView.getRadius());
            }}) ;





         Button minus = (Button)findViewById(R.id.minus);
         minus.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

                TouchView.setRadius(TouchView.getRadius() - 5);
                Log.e(TAG, "radius = "+TouchView.getRadius());

                TouchView.invalidate();// DOESN'T WORK***************

            }}) ;







    }//end of oncreate




}//end of jjilapp

public class TouchView extends View{



    private static int radius = 50;




    public TouchView(Context context) {
        super(context);

    }




    public TouchView(Context context, AttributeSet attr) {
        super(context,attr);
        Log.e(TAG, "++++++++++ inside touchview constructor");





    pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);         
    pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT)); 
    pTouch.setColor(Color.TRANSPARENT);
    pTouch.setStyle(Paint.Style.STROKE);


    }// end of touchView constructor






    @Override
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);

        Log.e(TAG, "******about to draw bgr ");
        canvas.drawBitmap(bgr, 0, 0, null);



       canvas.drawCircle(centreX, centreY, radius,pTouch);
       canvas.drawCircle(centreA, centreB, radius,pTouch);
        }

    }//end of onDraw



    public static int getRadius() {
        return radius;
    }




    public static void setRadius(int r) {
        radius = r;
    }




}

2 个答案:

答案 0 :(得分:3)

为什么radius和关联的get / set方法是静态的?这意味着,即使您的应用中同时有多个TouchViews,所有这些都将始终具有相同的半径。

首先从这三件事中删除static,以便每个TouchView都有自己的半径。接下来,不是从TouchView类本身调用TouchView方法,而是从您上面命名为TouchView的实际touchView实例中调用它们。 (例如touchView.setRadius(...)代替TouchView.setRadius(...)。)

invalidate不是View的静态方法,因此您无法将其作为一个方法调用。当属性发生变化时,视图应invalidate自己重新绘制。由于radius是TouchView的一个此类属性,因此应在invalidate()方法的末尾调用setRadius。这样,您就可以从活动中删除不属于他们的任何直接invalidate来电。

答案 1 :(得分:1)

您正在使用类的功能而不是对象,这意味着您使用:

TouchView.function()

而不是

touchView.function()

invalidate不是静态函数,因此您需要直接在对象本身上调用它。如果要从非UI线程更新视图,请不要忘记使用postInvalidate()。