Android EventHandler—给应用添加事件處理(直播vlc)

如果您想在 Android 中定義自己的元件,您可以使用事件處理者 (EventHandler),以下是常見的處理事件。

事件呼叫時機
onKeyDown(int, KeyEvent)當按鍵被按下時觸發
onKeyUp(int, KeyEvent)當按鍵被放開時觸發
onTrackballEvent(MotionEvent)當軌跡球運動時觸發
onTouchEvent(MotionEvent)當螢幕被碰觸時發生
onFocusChanged(boolean, int, Rect)當元件取得焦點或失去焦點時觸發

另外還有一些較為複雜的事件,像是 Layout 排版等事件,這些事件並非 View 的函數,但是卻與視覺化事件有關的,像是下列函數。

事件呼叫時機
Activity.dispatchTouchEvent(MotionEvent)在觸碰事件發生前就可以取得該事件
ViewGroup.onInterceptTouchEvent(MotionEvent)允許 ViewGroup 完鍵攔截其子元件的事件
ViewParent.requestDisallowInterceptTouchEvent(boolean)禁止攔截 onInterceptTouchEvent(MotionEvent)

以下是vlc添加事件处理的实例:

1.先是创建EventHandler类:

import java.util.ArrayList;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class EventHandler {
  //public static final int MediaMetaChanged                = 0;
    //public static final int MediaSubItemAdded               = 1;
    //public static final int MediaDurationChanged            = 2;
    //public static final int MediaParsedChanged              = 3;
    //public static final int MediaFreed                      = 4;
    //public static final int MediaStateChanged               = 5;
    //public static final int MediaPlayerMediaChanged         = 0x100;
    //public static final int MediaPlayerNothingSpecial       = 0x101;
    //public static final int MediaPlayerOpening              = 0x102;
    //public static final int MediaPlayerBuffering            = 0x103;
    public static final int MediaPlayerPlaying                = 0x104;
    public static final int MediaPlayerPaused                 = 0x105;
    public static final int MediaPlayerStopped                = 0x106;
    //public static final int MediaPlayerForward              = 0x107;
    //public static final int MediaPlayerBackward             = 0x108;
    public static final int MediaPlayerEndReached             = 0x109;
    public static final int MediaPlayerEncounteredError       = 0x10a;
    //public static final int MediaPlayerTimeChanged          = 0x10b;
    public static final int MediaPlayerPositionChanged        = 0x10c;
    //public static final int MediaPlayerSeekableChanged      = 0x10d;
    //public static final int MediaPlayerPausableChanged      = 0x10e;
    //public static final int MediaPlayerTitleChanged         = 0x10f;
    //public static final int MediaPlayerSnapshotTaken        = 0x110;
    //public static final int MediaPlayerLengthChanged        = 0x111;
    public static final int MediaPlayerVout                   = 0x112;
    public static final int MediaListItemAdded                = 0x200;
    //public static final int MediaListWillAddItem            = 0x201;
    public static final int MediaListItemDeleted              = 0x202;
    //public static final int MediaListWillDeleteItem         = 0x203;
    //public static final int MediaListViewItemAdded          = 0x300;
    //public static final int MediaListViewWillAddItem        = 0x301;
    //public static final int MediaListViewItemDeleted        = 0x302;
    //public static final int MediaListViewWillDeleteItem     = 0x303;
    //public static final int MediaListPlayerPlayed           = 0x400;
    //public static final int MediaListPlayerNextItemSet      = 0x401;
    //public static final int MediaListPlayerStopped          = 0x402;
    //public static final int MediaDiscovererStarted          = 0x500;
    //public static final int MediaDiscovererEnded            = 0x501;
    //public static final int VlmMediaAdded                   = 0x600;
    //public static final int VlmMediaRemoved                 = 0x601;
    //public static final int VlmMediaChanged                 = 0x602;
    //public static final int VlmMediaInstanceStarted         = 0x603;
    //public static final int VlmMediaInstanceStopped         = 0x604;
    //public static final int VlmMediaInstanceStatusInit      = 0x605;
    //public static final int VlmMediaInstanceStatusOpening   = 0x606;
    //public static final int VlmMediaInstanceStatusPlaying   = 0x607;
    //public static final int VlmMediaInstanceStatusPause     = 0x608;
    //public static final int VlmMediaInstanceStatusEnd       = 0x609;
    //public static final int VlmMediaInstanceStatusError     = 0x60a;

    private ArrayList<Handler> mEventHandler;
    private static EventHandler mInstance;

    private EventHandler() {
        mEventHandler = new ArrayList<Handler>();
    }

    public static EventHandler getInstance() {
        if (mInstance == null) {
            mInstance = new EventHandler();
        }
        return mInstance;
    }

    public void addHandler(Handler handler) {
        if (!mEventHandler.contains(handler))
            mEventHandler.add(handler);
    }

    public void removeHandler(Handler handler) {
        mEventHandler.remove(handler);
    }

    /** This method is called by a native thread *//此方法是发送事件处理的handler。被加入到
native thread。至于怎么添加进去的还是个问题*/
 public void callback(int event, Bundle b) { b.putInt("event", event); for (int i = 0; i < mEventHandler.size(); i++) { Message msg = Message.obtain(); msg.setData(b); mEventHandler.get(i).sendMessage(msg); } }}
2.然后在主类Activity中使用
//在oncreat():
 EventHandler em = EventHandler.getInstance();
        em.addHandler(eventHandler);
创建事件处理者:
	private final Handler eventHandler = new VideoPlayerEventHandler(this);
	private class VideoPlayerEventHandler extends
			WeakHandler<VideoPlayerActivity> {
		public VideoPlayerEventHandler(VideoPlayerActivity owner) {
			super(owner);
		}
		public void handleMessage(Message msg) {
			VideoPlayerActivity activity = getOwner();
			if (activity == null)
				return;
			switch (msg.getData().getInt("event")) {
			case EventHandler.MediaPlayerPlaying:
				loadingView.setVisibility(View.GONE);
				bufferView.setVisibility(View.GONE);
				break;
			case EventHandler.MediaPlayerPaused:
				loadingView.setVisibility(View.GONE);
				bufferView.setVisibility(View.VISIBLE);
				break;
			case EventHandler.MediaPlayerStopped:				 
				break;
			case EventHandler.MediaPlayerEndReached:
				break;
			case EventHandler.MediaPlayerVout:
				break;
			case EventHandler.MediaPlayerPositionChanged:
                //don't spam the logs
                break;
            case EventHandler.MediaPlayerEncounteredError:
            	handler.sendEmptyMessageDelayed(LOADING_10SEC, 100);
//                Log.i(TAG, "MediaPlayerEncounteredError");
//                activity.encounteredError();
                break;
			default:
				Log.i(TAG, "eventHandler : " + msg.getData().getInt("event"));
				break;
			}
		}
	};

程序退出是需要清除自定义的事件处理:

	protected void onDestroy() {
		EventHandler em = EventHandler.getInstance();
		em.removeHandler(eventHandler);
		mAudioManager = null;
	}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值