Android 7.0 Gallery图库源码分析1
来源:互联网 发布:关闭nagle算法 编辑:程序博客网 时间:2024/06/04 19:03
转载出处:http://blog.csdn.net/lb377463323/article/details/68946581
分析一个项目的源代码时,第一件事就是查看清单文件,找到程序入口,我们从Gallery2源码的清单文件中可以看到GalleryActivity是此应用的启动Activity。
<activity android:name="com.android.gallery3d.app.GalleryActivity" android:label="@string/app_name" android:configChanges="keyboardHidden|orientation|screenSize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.APP_GALLERY" /> </intent-filter>
找到GalleryActivity,它继承自AbstractGalleryActivity,实现OnCancelListener,OnCancelListener暂时不用考虑,它只是处理dialog防止内存泄漏,我们首先查看onCreate方法
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_ACTION_BAR); //使用ActionBar的覆盖模式 requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY); if (getIntent().getBooleanExtra(KEY_DISMISS_KEYGUARD, false)) { //加载布局之前解除锁屏 getWindow().addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); } //加载布局 setContentView(R.layout.main); if (savedInstanceState != null) { getStateManager().restoreFromState(savedInstanceState); } else { //根据Intent类型初始化 initializeByIntent(); } }
我们首先分析布局,找到R.layout.main
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gallery_root" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <include layout="@layout/gl_root_group"/> <FrameLayout android:id="@+id/header" android:visibility="gone" android:layout_alignParentTop="true" android:layout_width="match_parent" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/footer" android:visibility="gone" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_width="match_parent" android:layout_height="wrap_content"/></RelativeLayout>
根据id我们可以判断layout/gl_root_group这个布局应该是最主要的,用来显示主要内容,header和footer暂且不管。gl_root_group是通过include标签来引用的,我们找到此布局。
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <com.android.gallery3d.ui.GLRootView android:id="@+id/gl_root_view" android:layout_width="match_parent" android:layout_height="match_parent"/> <View android:id="@+id/gl_root_cover" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/black"/></merge>
它有两个布局。第一个是GLRootView,它继承自GLSurfaceView,也就是说它是使用OpenGL ES来绘制界面,它也是整个界面的核心;第二个是View,根据它的id可以看出它是覆盖在GLRootView上的,至于它的作用我们在GLRootView的onDrawFrame方法中可以发现下面这段代码,它是应用第一次绘制界面时覆盖在SurfaceView上面,防止第一次绘制时SurfaceView变透明,影响美观,之后都会隐藏此View。
// We put a black cover View in front of the SurfaceView and hide it// after the first draw. This prevents the SurfaceView being transparent// before the first draw.if (mFirstDraw) { mFirstDraw = false; post(new Runnable() { @Override public void run() { View root = getRootView(); View cover = root.findViewById(R.id.gl_root_cover); cover.setVisibility(GONE); } }); }
我们接着看GLRootView,它继承自GLSurfaceView,所以它绘制界面核心就是下面三个方法。
public class GLRootView extends GLSurfaceView implements GLSurfaceView.Renderer, GLRoot { @Override public void onSurfaceCreated(GL10 gl1, EGLConfig config) { //Suface创建好会回调此方法,一般这个方法都是做些绘制界面的准备工作 } @Override public void onSurfaceChanged(GL10 gl1, int width, int height) { //Suface改变时回调此方法,比如横竖屏转换等,这里面一般是重新设置界面size等 } @Override public void onDrawFrame(GL10 gl) { //每绘制一帧都会回调此方法,也就是说你想绘制三角形还是纹理贴图等都是在这方法里面实现。 try { //这个方法是实际绘制界面的 onDrawFrameLocked(gl); } finally { mRenderLock.unlock(); } }}
我们接着查看onDrawFrameLocked方法
private void onDrawFrameLocked(GL10 gl) { ...... //mContentView是GLView类型,mCanvas是GLCanvas类型,这是绘制界面的主要工具 if (mContentView != null) { mContentView.render(mCanvas); } else { // Make sure we always draw something to prevent displaying garbage mCanvas.clearBuffer(); } ...... }
现在讲讲GLView和GLCanvas这两个类,GLView是界面显示的UI组件,图库界面是有很多个小控件组成的,GLView就是这些小控件的基类,它可以渲染到GLCanvas上,并且接受触摸事件。GLCanvas就是一个画布,GLView的size等定义好了怎么显示到界面上呢?其实就是通过GLCanvas来实现,GLCanvas是一个接口,它最终是使用OpenGL ES的GLES20.glDrawArrays(type, 0, count)来绘制每个GLView,它可以绘制直线、矩形等形状,对OpenGL ES有个大概了解。
GLView的子类在com.Android.gallery3d.ui目录里,以view.Java结尾的都是它的子类,像EdgeView、PhotoView、ScrollBarView、SlideshowView、SlotView、TileImageView、UndoBarView等,每个代表一种UI组件类型。
GLCanvas有GLES11Canvas和GLES20Canvas两个子类,GLES11Canvas代表OpenGL ES 1.1之前的版本,使用固定管线绘图,这个版本太老可以不考虑了;GLES20Canvas代表OpenGL ES 2.0之后的版本,使用shader语言实现绘图,现在一般都是使用它。
- Android 7.0 Gallery图库源码分析1
- Android 7.0 Gallery图库源码分析1
- Android 7.0 Gallery图库源码分析2
- Android 7.0 Gallery图库源码分析3
- Android 7.0 Gallery图库源码分析4
- Android 7.0 Gallery图库源码分析5
- Android 7.0 Gallery图库源码分析6
- Android 7.0 Gallery图库源码分析7
- Android 7.0 Gallery图库源码分析8
- Android 7.0 Gallery图库源码分析9
- 编译Android Gallery图库源码所遇bug
- android从图库(gallery)选择一张图片
- android从图库(gallery)选择一张图片
- Android源码之Gallery专题研究(1)
- Google Gallery for Android 4.4源码分析以及主UI修改——Gallery整体结构
- android gallery photoview分析
- Matplotlib gallery 图库
- 分析图库
- oracle重建控制文件的resetlogs选项
- 保护模式下的RPL(一)
- 大型网站技术架构演变过程
- 工具类-获取一定长度的随机字符串
- 使用WinINet和WinHTTP实现Http访问
- Android 7.0 Gallery图库源码分析1
- java学习资料(不定期更新)
- Unity判断手势的滑动方向,单点触摸和多点触摸,并获取刚触摸以及触摸结束事的坐标
- android_material_design_colours
- Linux命令之tar
- 权限申请的那些事
- miniui-input
- Set集合及子类
- mybatis ${} sql注入