我有一个应用程序,我想在位图上放置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;
}
}
答案 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()。