Android Canvas和Listener

时间:2015-06-28 03:22:03

标签: java android canvas

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

在MainActivity Class中

    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 ;

2 个答案:

答案 0 :(得分:1)

您可以(实际上应该)使用观察者模式执行此操作。

你不需要你的价值是一个静态的,它实际上打破了封装原则。

我认为某些代码可能会让你更好,所以我会为你提供代码示例,但首先是一些解释:

  • 实现Observer模式的常用方法是使用Interfaces作为观察者和观察者之间的承包商。
  • Observable类将定义接口并创建一个setter,允许任何实现此接口的类将自己注册为侦听器。
  • 在观察者方面,我们实现了可观察的界面,通过这样做,我们将有一些方法来实现。
  • observable将只检查是否有侦听器,如果有,将通过接口方法通知所需的信息。

以下是一个说明其工作原理的示例:

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

}

在这个自定义视图中,我设置了每秒运行一次的runnable。它做了两件事:

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

现在,这是一个示例活动,将观察此视图的更改:

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 + "");
    }
}

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

请注意,活动必须通过MyBringBack中定义的侦听器setter注册自己:setBringBackListener();

答案 1 :(得分:0)

好吧,你可以创建一个方法,每次你对变量进行更改时都会调用它。 你知道大多数听众背后的模式是什么吗?观察者模式。因此,如果你想在你的代码中为该实现一个观察者模式一个自己的监听器!