现在的位置: 首页 > 综合 > 正文

Gallery3d 学习笔记(3)

2013年11月10日 ⁄ 综合 ⁄ 共 2770字 ⁄ 字号 评论关闭

Android 的多媒体数据库文件存在什么地方呢 ?/data/data/com.android.providers.media/databases  只要有权限的手机都可以看到有两个数据库文件,

internal.db和external-**.db,分别对应内部存储器数据库文件和外部存储器数据库文件。

都第三节了,各位可能都着急还没有Activity的分析,其实外围分析清楚了,内部才更清楚。

root 手机后(ENG版本不用),adb 将数据库文件拉出来,使用命令或者数据库工具打开文件,看下有哪些表

albums 

album_art

artiest

image 

video 

thumbnails 

videothumbnails  

这里详细记录了音频 视频 图片的相关信息,甚至连图片缩略图和视频缩略图也有表格

这里说明一个问题,扫描不光扫描路径和建立数据库,还把缩略图也建立好了。

但是有个问题,图片本身很大也很多,即使是缩略图也不会小,会把整个缩略图都放到数据库中么?

答案当然不是,扫描的时候将缩略图保存在T卡/DCIM/.thumbnails/目录中,数据库中只保存一个指向的路径就可以了。

到缩略图界面时,我们只要将这些图贴上去就好了,这个界面简单吧。

有个问题,如果没有T卡,那不是找不到这个目录么?

是的,没有T卡,你会发现Gallery3D 跑起来后提示 [无可用外部存储器],然后就退出来了。这也说明没有T卡,Gallery的缩略图看不到的原因。

系统竟然做好了这么多工作,而且现在Gallery3D还没有跑起来。

那么我们准备学习主要的Activity,在学习主Activity之前,最好先学习一下OpenGL 的内容,因为这个Activity里面要用到,开始学习相关内容。

public final class Gallery extends Activity{
	private RenderView mRenderView = null;
	private GridLayer mGridLayer;
	@Override
	public void onCreate(Bundle savedInstanceState){
		mRenderView = new RenderView(this);
		mGridLayer = new GridLayer(this, (int) (96.0f * App.PIXEL_DENSITY),
				(int) (72.0f * App.PIXEL_DENSITY), new GridLayoutInterface(4),
				mRenderView);
		mRenderView.setRootLayer(mGridLayer);
		setContentView(mRenderView);
 }
}

public final class RenderView extends GLSurfaceView implements GLSurfaceView.Renderer, SensorEventListener {
}

public final class GridLayer extends RootLayer implements MediaFeed.Listener, TimeBar.Listener {
}

public abstract class RootLayer extends Layer {
}

简化代码,发现Gallery就是一个Activity,里面加了个东西,一个继承于GLSurfaceView的视图mRenderView,而且这个View 将mGridLayer设置成了根层

这些都用什么作用呢?

我们现在理解的是,添加了一个视图,那么在setContentView 之后,在RenderView之中看到了两个消息响应

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Ignore events received before the surface is created to avoid
        // deadlocking with GLSurfaceView's needToWait().
        if (mGL == null) {
            return false;
        }
        // Wait for the render thread to process this event.
        if (mTouchEventQueue.size() > 8 && event.getAction() == MotionEvent.ACTION_MOVE)
            return true;
        synchronized (mTouchEventQueue) {
            MotionEvent eventCopy = MotionEvent.obtain(event);
            mTouchEventQueue.addLast(eventCopy);
            requestRender();
        }
        return true;
    }

如果GL刷新还没有好,就没有任何作用,触摸消息队列大于8后的触摸移动消息就没有用了,所以移动很长时间对于这个应用是没有作用的。

将获得的消息放到队列中,刷新界面。谁来处理呢?下次我们会讲

而按键消息呢?

   @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // Ignore events received before the surface is created to avoid
        // deadlocking with GLSurfaceView's needToWait().
        if (mGL == null) {
            return false;
        }

        // Wait for the render thread to process this event.
        try {
            synchronized (this) {
                mCurrentKeyEvent = event;
                mCurrentEventType = EVENT_KEY;
                requestRender();
                long timeout = SystemClock.uptimeMillis() + 50;
                do {
                    wait(50);
                } while (mCurrentEventType != EVENT_NONE && SystemClock.uptimeMillis() < timeout);
            }
        } catch (InterruptedException e) {
            // Stop waiting for the render thread if interrupted.
        }

        // Key events are handled on the main thread.
        boolean retVal = false;
        if (!mCurrentKeyEventResult) {
            retVal = super.onKeyDown(keyCode, event);
        } else {
            retVal = true;
        }
        requestRender();
        return retVal;
    }

只看到存储按键事件,和刷新,什么地方处理的?下次我们讲解

抱歉!评论已关闭.