как сделать пользовательский вид недействительным от активности - PullRequest
1 голос
/ 27 августа 2011

У меня есть приложение, в котором я хочу разместить 2 круга на растровом изображении. у меня есть 2 кнопки, одна для увеличения радиуса и одна для уменьшения радиуса. Кнопки накачаны из xml в активности. вид деятельности - это пользовательский вид. я могу получить кнопки, которые будут отображаться на виде, и обе изменят соответственно радиус-переменную. Все идет нормально. я не могу получить вид, чтобы сделать недействительным при нажатии любой кнопки. что должно произойти, это то, что при нажатии кнопки радиус изменяется, а холст перерисовывается, чтобы показать изменения радиуса. Как я могу назвать недействительным из onclick ()? Я не уверен, что это лучший способ сделать это. Благодарю. .

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 ]

3 голосов
/ 27 августа 2011

Почему radius и связанные методы get / set статичны?Это означает, что даже если бы в вашем приложении было несколько TouchViews одновременно, все они всегда имели бы одинаковый радиус.

Начните с удаления static из этих трех вещей, чтобы каждый TouchViewсвой радиус.Затем, вместо того, чтобы вызывать ваши TouchView методы из самого класса TouchView, вызывайте их из вашего фактического TouchView экземпляра, который вы назвали touchView выше.(например, touchView.setRadius(...) вместо TouchView.setRadius(...).)

invalidate не является статическим методом представления, поэтому вы не можете вызывать его как единое целое.Представления должны invalidate сами при изменении их свойств, что потребует их перерисовки.Так как радиус является одним из таких свойств для вашего TouchView, он должен вызывать invalidate() для себя в конце метода setRadius.Это позволит вам удалить любые прямые вызовы invalidate из вашей деятельности, где они не принадлежат.

1 голос
/ 27 августа 2011

Вы используете функцию класса, а не объект, то есть вы используете:

TouchView.function()

вместо

touchView.function()

invalidate не является статической функцией, поэтому вам нужно вызывать ее непосредственно для самого объекта. Не забудьте использовать postInvalidate (), если вы обновляете представление из потока, не являющегося пользовательским интерфейсом.

...