как сделать пользовательский вид недействительным от активности

1

У меня есть приложение, в котором я хочу разместить 2 круга в растровом изображении. У меня есть две кнопки, одна для увеличения радиуса и одна для уменьшения радиуса. Кнопки завышены от xml в действии. представление активности - это пользовательское представление. я могу получить кнопки для отображения на представлении, и оба изменяют переменную радиуса соответственно. Все идет нормально. Я не могу получить представление о недействительности при нажатии любой кнопки. то, что должно произойти, - это когда кнопка нажата, радиус изменяется, а холст перерисовывается, чтобы показать изменение радиуса. Как я могу назвать invalidate из 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;
    }




}
  • 0
    Я не совсем понимаю. Что не так с touchView.invalidate () ;?
Теги:
custom-view

2 ответа

1
Лучший ответ

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

TouchView.function()

вместо

touchView.function()

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

  • 0
    OnClickListeners всегда будет вызываться из потока пользовательского интерфейса, и любой правильный код Android никогда не будет обновлять представления из потока, отличного от потока пользовательского интерфейса. (Вот почему это называется потоком пользовательского интерфейса. :))
  • 2
    ну, вот почему id не сказал "измени свой код на ...". Я только подумал, что стоит упомянуть, что в случае вызова из не-пользовательского потока, postInvalidate в порядке.
Показать ещё 2 комментария
3

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

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

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

  • 0
    спасибо за эту информацию. То, как вы описали, - это то, как представления должны обновляться. Я изменю сеттер, чтобы отразить это. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню