六. 图片预览与整体布局分析

来源:互联网 发布:监控网络键盘 编辑:程序博客网 时间:2024/04/30 10:52

一、相关类图



二、相关类的说明

   1、FilmStripView类

它继承ViewGroup,作为预览图片的容器类。在这里类里,两个关键的对象。

mController是MyController实例。

mZoomView 是ZoomView实例。

接口:

ImageData:保存预览图的所需的通用接口

DataAdapter:处理预览图片的适配器接口。在FilmStripView类中,声明了它的对象。通过setDataAdapter方法给它赋值。

Listener :此接口在CameraActivity类里面通过内部类实现。

Controller:对FilmStripView进行控制,具体实现的类MyController。控制滚动,切换等。

ViewItem:每一个存入FilmStripView的相片View的一些属性辅助类。包括View,动作监听器,还有area。

   2、FixedFirstDataAdapter

           将照相预览界面放在第一个位置。其他以CameraDataAdapter类的对象形势放入。CameraDataAdapter是给camera 文件夹提供数据。

   3、FilmStripGestureRecognizer

           这个类是用来处理手势识别的。它包含GestureDetector和ScaleGestureDetector。

GestureDetector用来处理多种手势,通过GestureDetector.OnGestureListener来获取当前被触发的操作手势(SingleTap Up、Show Press、Long Press、Scroll、Down、Fling)等。在FilmStripGestureRecognizer类里,MyGestureListener内部类就是继承GestureDetector.OnGestureListener的类。

ScaleGestureDetector这个类是专门用来检测两个手指在屏幕上做缩放的手势用的。通过

ScaleGestureDetector.SimpleOnScaleGestureListener来获取缩放手势。MyScaleListener内部类就是继承它的类。



MyGestureReceiver继承FilmStripGestureRecognizer.Listener,在FilmStripGestureRecognizer类中,处理手势识别相关动作后,通过mListener对象,调用MyGestureReceiver类里面的相关方法。来返回到FilmStripView 类里面进行动作处理。

4、ZoomView

针对预览的图片放大超过屏幕的大小的时候,就会将预览的图片放在ZoomView的区域内。

   5、MyController

          这个类实际上是通过MyGestureReceiver类来调用里面的方法的。针对不同的响应,做出不同的动作。

三、拍照后相片如何存储到FilmStripView相关的View

         按键拍照后,调用PhotoModule类里面的mOnMediaSavedListener监听器的onMediaSaved方法。然后调用CameraActivity类的notifyNewMedia方法。然后调用mDataAdapter.addNewPhoto(cr,uri);方法。然后就到了CameraDataAdapter类里面的addNewPhoto方法。然后再调用insertData方法。再就调用到了FilmStripView类里面的setDataAdapter方法里面的下面语句的方法里。

 mDataAdapter.setListener(new DataAdapter.Listener() {

           @Override

           public void onDataLoaded() {

                reload();

           }

 

           @Override

           public void onDataUpdated(DataAdapter.UpdateReporter reporter) {

                update(reporter);

           }

 

           @Override

           public void onDataInserted(int dataID, ImageData data) {

                if (mViewItem[mCurrentItem] ==null) {

                    // empty now, simply do areload.

                    reload();

                    return;

                }

                updateInsertion(dataID);

           }

 

           @Override

           public void onDataRemoved(int dataID, ImageData data) {

                animateItemRemoval(dataID,data);

           }

       });

 

调用onDataInserted方法。在这个方法里,将最新的照片信息存储在mViewItem数组里。

 

四、相机拍照预览界面滑动进入照片预览界面的过程分析

1、时序图  

      

  2、分析说明

我们在拍照预览界面滑动的的时候,通过手势监听类MyGestureListener的onScroll 方法调用MyGestureReceiver类的onScroll方法。再次调用MyController的scroll方法。执行invalidate方法,然后调用onDraw方法,再次调用layoutViewItems方法。

 

scaleTo 方法作用是将预览的照片的大小,缩放成屏幕的50%。

layoutViewItems 方法作用是滑动后,滑动的下一张图片到屏幕中间。


0 0
原创粉丝点击