您的位置:首页 > 移动开发 > Android开发

android 5.0 Launcher3,Gallery2中响应按键,实现翻页效果

2015-11-27 16:15 585 查看
最近做的项目中有需要实现在桌面(Launcher3)和 图库(Gallery2)上响应按键事件,实现桌面翻页(类似滑动翻页),以及图库图片查看时翻页(查看下一张图片)。

网上找资料没有具体说在代码哪个地方去具体实现,折腾了两三天终于解决此问题,现把修改方案纪录下,共参考。

图库 Gallery2中实现查看图片时响应按键事件翻页效果代码:

public class AbstractGalleryActivity extends Activity implements GalleryContext {
.......

// Added by Janning begin
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
// TODO Auto-generated method stub
mGLRootView.dispatchKeyEventView(event);
return super.dispatchKeyEvent(event);
}
// Added by Janning end
} public class GLRootView extends GLSurfaceView
implements GLSurfaceView.Renderer, GLRoot {
..........

// Added by Janning begin
public void dispatchKeyEventView(KeyEvent event) {
mRenderLock.lock();
try {
if (mContentView != null) {
mContentView.dispatchKeyEvent(event);
}
} finally {
mRenderLock.unlock();
}
}
// Added by Janning end
}public class GLView {

..........

// Added by Janning begin
protected void dispatchKeyEvent(KeyEvent event) {
for (int i = getComponentCount() - 1; i >= 0; --i) {
GLView component = getComponent(i);
if (component.getVisibility() != GLView.VISIBLE)
continue;
if (component != null) {
component.onKeyEvent(event);
}
}
}

protected void onKeyEvent(KeyEvent event) {
}
// Added by Janning end
}public class PhotoView extends GLView {

...........

private boolean slideToNextPicture() {
if (mNextBound <= 0) return false;
switchToNextImage();
mPositionController.startHorizontalSlide();
return true;
}

private void switchToNextImage() {
mModel.moveTo(mModel.getCurrentIndex() + 1);
}

protected void onKeyEvent(KeyEvent event) {
// Added by Janning begin
// for handling the page down key event to implement switch to next image
int keyCode = event.getKeyCode();
int action = event.getAction();
Log.d(TAG + "/SLCODE", " keyEvent: " + event
+ " -- mNextBound: " + mNextBound);
if (KeyEvent.KEYCODE_PAGE_DOWN == keyCode && KeyEvent.ACTION_DOWN == action) {
if (mNextBound <= 0) {
switchToFirstImage();
// because the index '0' is Camera activity,
// so switch to the second one(index is '1')
if (mModel.isCamera(0)) {
mModel.moveTo(1);
}
} else {
slideToNextPicture();
}
}
// Added by Janning end
}
}


Launcher3中实现响应按键事件翻页效果代码:

public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChangeListener {

。。。。。

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
boolean handled = mDragController.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
// Added by Janning begin
// For responsing the desktop sliding around
LauncherLog.d("SLCODE", TAG + " dispatchKeyEvent KeyEvent: " + event);
handled = mLauncher.getWorkspace().dispatchKeyEvent(event);
// Added by Janning end
if (LauncherLog.DEBUG_KEY) {
LauncherLog.d(TAG, "dispatchKeyEvent: keycode = " + event.getKeyCode() + ", action = "
+ event.getAction() + ", handled = " + handled);
}
return handled;
}

}/**
* The workspace is a wide area with a wallpaper and a finite number of pages.
* Each page contains a number of icons, folders or widgets the user can
* interact with. A workspace is meant to be used with a fixed width only.
*/
public class Workspace extends SmoothPagedView
implements DropTarget, DragSource, DragScroller, View.OnTouchListener,
DragController.DragListener, LauncherTransitionable, ViewGroup.OnHierarchyChangeListener,
Insettable {

..........

private void moveToScreen(int page, boolean animate) {
if (!workspaceInModalState()) {
if (animate) {
snapToPage(page);
} else {
setCurrentPage(page);
}
}
View child = getChildAt(page);
if (child != null) {
child.requestFocus();
}
}

// Added by Janning begin
// For responding the KeyEvent to control desktop sliding around
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
int action = event.getAction();
if (KeyEvent.KEYCODE_PAGE_DOWN == keyCode && KeyEvent.ACTION_UP == action) {
int size = mScreenOrder.size();
LauncherLog.d("SLCODE", TAG + " onKeyDown screen size: " + size
+ " -- currentPage: " + mCurrentPage);
if (mCurrentPage == size-1) {
moveToScreen(0, true);
} else if (mCurrentPage < size-1) {
moveToScreen(mCurrentPage+1, true);
}
return true;
}
return false;
}
// Added by Janning end

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息