gpt4 book ai didi

java - 如何使自定义 View 从 Activity 中失效

转载 作者:行者123 更新时间:2023-11-29 03:54:20 25 4
gpt4 key购买 nike

我有一个应用程序,我想在位图上放置 2 个圆圈。我有 2 个按钮,一个用于增加半径,一个用于减小半径。这些按钮是从 Activity 中的 xml 中膨胀的。 Activity 的 View 是自定义 View 。我可以让按钮显示在 View 上,并且两者都相应地改变半径变量。到目前为止,一切都很好。单击任一按钮时,我无法使 View 失效。应该发生的是,当单击按钮时,半径会发生变化,然后重新绘制 Canvas 以显示半径变化。我如何从 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;
}




}

最佳答案

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

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

invalidate 不是 View 的静态方法,因此您不能将其作为一个方法调用。当 View 的属性发生变化而需要重绘时, View 应该使自己失效。由于 radius 是您的 TouchView 的一个此类属性,它应该在 setRadius 方法的末尾调用自身的 invalidate()。这将使您可以从不属于它们的 Activity 中删除任何直接的 invalidate 调用。

关于java - 如何使自定义 View 从 Activity 中失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7216458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com