gpt4 book ai didi

java - Android Canvas 和监听器

转载 作者:行者123 更新时间:2023-12-01 11:22:14 27 4
gpt4 key购买 nike

我正在使用一个扩展 View 的类来创建 Canvas 。它的名称是 MyBringBack 类。在我的 MainActivity 类中,我以编程方式定义了一个布局。 MyBringBack 类中有一个公共(public)静态变量,我在 MyBringBack 类的某些部分更改了它的值。是否可以知道该变量何时发生变化?我想通过使用此更改来更改 MainActivitiy 类中的某些内容。

在MainActivity类中

    setContentView(R.layout.activity_main);
li = (LinearLayout) findViewById(R.id.canvasLayout);
//This is where i have to bring the canvas

MyBringBack pcc = new MyBringBack (this);
li.addView(pcc);

在 MyBringBack 类中

public static int score =0 ;

最佳答案

您可以(而且实际上应该)使用观察者模式来做到这一点。

您不需要将值设置为静态值,这实际上违反了封装原则。

我认为一些代码可能会让您更轻松,所以我将为您提供一个代码示例,但首先,一些解释:

  • 实现观察者模式的常见方法是使用接口(interface)作为观察者和可观察对象之间的契约者。
  • Observable 类将定义接口(interface)并创建一个 setter,允许任何实现此接口(interface)的类将自身注册为监听器。
  • 在观察者方面,我们实现了可观察对象的接口(interface),这样我们就可以实现一些方法。
  • 可观察对象将简单地检查是否有监听器,如果有,将通过接口(interface)方法通知所需的信息。

这里有一个例子来说明它是如何工作的:

public class MyBringBack extends View {

// ----------------------------------
// INTERFACES
// ----------------------------------

public interface BringBackListener {
public abstract void onObservableValueChanged(int value);
}

// ----------------------------------
// CONSTANTS
// ----------------------------------

private static final int VALUE_UPDATE_TIMEOUT = 1000;

// ----------------------------------
// ATTRIBUTES
// ----------------------------------

private int mObservableValue = 0;

private static Handler mHandler;
private static UpdateObservableValueRunnable mUpdateObservableValueRunnable;

private BringBackListener mListener;

// ----------------------------------
// CONSTRUCTORS
// ----------------------------------

public MyBringBack(Context context) {
super(context);
initializeView();
}

public MyBringBack(Context context, AttributeSet attrs) {
super(context, attrs);
initializeView();
}

public MyBringBack(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initializeView();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public MyBringBack(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initializeView();
}

// ----------------------------------
// PUBLIC METHODS
// ----------------------------------

public void setBringBackListener(BringBackListener listener) {
mListener = listener;
}

// ----------------------------------
// PRIVATE METHODS
// ----------------------------------

private void initializeView() {
mHandler = new Handler();
mUpdateObservableValueRunnable = new UpdateObservableValueRunnable();

mHandler.postDelayed(mUpdateObservableValueRunnable, VALUE_UPDATE_TIMEOUT);
}

// ----------------------------------
// NESTED CLASSES
// ----------------------------------

private class UpdateObservableValueRunnable implements Runnable {
public void run() {
mObservableValue++;
if (mListener != null) {
mListener.onObservableValueChanged(mObservableValue);
}

mHandler.postDelayed(mUpdateObservableValueRunnable, VALUE_UPDATE_TIMEOUT);
}
}; // UpdateObservableValue

}

在此自定义 View 中,我设置了每秒运行的可运行对象。它做了两件事:

  • 增加一个整数
  • 检查监听器是否设置为用此 int 的新值通知它。

现在这是一个示例 Activity ,它将观察此 View 的变化:

public class MainActivity extends ActionBarActivity implements BringBackListener {

// ----------------------------------
// ATTRIBUTES
// ----------------------------------

private TextView mResultTextView;

// ----------------------------------
// LYFECYCLE
// ----------------------------------

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mResultTextView = (TextView) findViewById(R.id.resultTextView);
LinearLayout li = (LinearLayout) findViewById(R.id.canvasLayout);

MyBringBack pcc = new MyBringBack(this);
li.addView(pcc);

// Do not forget to set the listener (here it is the MainActivity
// since it implements BringBackListener)
pcc.setBringBackListener(this);
}

// ----------------------------------
// IMPLEMENTED METHODS
// ----------------------------------

@Override
public void onObservableValueChanged(int value) {
mResultTextView.setText(value + "");
}
}

此 Activity 实现了 BringBackListener,因此我们必须实现 onObservableValueChanged(int value)。通过这个方法,Activity 能够观察到变化。

请注意, Activity 必须通过 MyBringBack 中定义的监听器 setter 来注册自身:setBringBackListener();

关于java - Android Canvas 和监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31095832/

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