У меня есть приложение, в котором я хочу разместить 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;
}
}
Вы используете функцию класса, а не объект, что означает, что вы используете:
TouchView.function()
вместо
touchView.function()
invalidate не является статической функцией, поэтому вам нужно вызвать ее непосредственно на самом объекте. Не забудьте использовать postInvalidate(), если вы обновляете представление из потока, отличного от UI.
Почему radius
и связанные методы get/set статичны? Это означает, что даже если у вас сразу было несколько TouchViews
, все они всегда будут иметь одинаковый радиус.
Начните с удаления static
из этих трех вещей, чтобы каждый TouchView
имел свой собственный радиус. Затем вместо вызова методов TouchView
из самого класса TouchView
вызовите их из вашего фактического экземпляра TouchView
который вы назвали touchView
выше. (например, touchView.setRadius(...)
вместо TouchView.setRadius(...)
.)
invalidate
не является статическим методом представления, поэтому вы не можете его вызывать. Представления должны invalidate
себя при изменении их свойств, что потребовало бы их перерисовки. Поскольку радиус является одним из таких свойств для вашего TouchView
он должен вызвать invalidate()
сам по себе в конце метода setRadius
. Это позволит вам удалить любые прямые invalidate
вызовы из своей деятельности, где они не принадлежат.