当前位置:  编程技术>移动开发
本页文章导读:
    ▪UITapGestureRecognizer的使用影响视图下某些控件的action的有关问题        UITapGestureRecognizer的使用影响视图上某些控件的action的问题我的界面上的视图层次是这样的: scrollView=[[UIScrollView alloc] initWithFrame:self.view.frame];     scrollView.backgroundColor=[UIColor clearColor];     [.........
    ▪ 【Google官方教程】前言:高效地显示Bit地图(位图)        【Google官方教程】前言:高效地显示Bitmap(位图) 转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-)  http://blog.csdn.net/floodingfire/article/details/81.........
    ▪ gallery3d的源码分析——通道口2       gallery3d的源码分析——入口2@Override public void onPause() { super.onPause(); if (mRenderView != null) mRenderView.onPause(); if (mWakeLock != null) { if (mWakeLock.isHeld()) { .........

[1]UITapGestureRecognizer的使用影响视图下某些控件的action的有关问题
    来源: 互联网  发布时间: 2014-02-18
UITapGestureRecognizer的使用影响视图上某些控件的action的问题

我的界面上的视图层次是这样的:

scrollView=[[UIScrollView alloc] initWithFrame:self.view.frame];
    scrollView.backgroundColor=[UIColor clearColor];
    [self.view addSubview:scrollView];
    [scrollView release];


userInfoView=[[UIView alloc] initWithFrame:CGRectMake(0, 84, 320, 376)];
    userInfoView.backgroundColor=[UIColor clearColor];
    userInfoView.userInteractionEnabled=YES;
    [scrollView addSubview:userInfoView];
    [userInfoView release];

UIButton *editButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    editButton.frame=CGRectMake(93, 248, 115, 37);
    editButton.userInteractionEnabled=YES;
    [editButton setTitle:@"修改用户信息" forState:UIControlStateNormal];
    [editButton addTarget:self action:@selector(changeUserInfo) forControlEvents:UIControlEventTouchUpInside];
    [userInfoView addSubview:editButton];

UILabel *oldPassWordLabel=[[UILabel alloc] initWithFrame:CGRectMake(20, 53, 87, 20)];
    oldPassWordLabel.text=@"原口令:";
    oldPassWordLabel.textAlignment=UITextAlignmentLeft;
    oldPassWordLabel.backgroundColor=[UIColor clearColor];
    [passwordView addSubview:oldPassWordLabel];
    [oldPassWordLabel release];

oldPassword=[[UITextField alloc] initWithFrame:CGRectMake(124, 48, 176,30)];
    oldPassword.borderStyle=UITextBorderStyleRoundedRect;
    oldPassword.clearButtonMode=UITextFieldViewModeWhileEditing;
    oldPassword.text=@"";
    oldPassword.delegate=self;
    oldPassword.returnKeyType=UIReturnKeyNext;
    //oldPassword.backgroundColor=[UIColor clearColor];
    oldPassword.secureTextEntry=YES;
    [passwordView addSubview:oldPassword];
    [oldPassword release];

UITapGestureRecognizer* onTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    onTap.delegate = self;
    [passwordView addGestureRecognizer:onTap];
    [onTap release];

加上onTap之后,当我点击editButton的时候只调用handleSingleTap这个方法,不调用changeUserInfo这个方法,点击oldPassword输入内容喝点击clearButton清楚内容的时候也不好用,后来我加上这么一句话 onTap.cancelsTouchesInView=NO;然后点击按钮好用了,可是点击oldPassword还是不好用,最后发现这样可以解决这个问题:UIGestureRecognizerDelegate这个代理方法里面有这个- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    if (oldPassword.superview!=nil) {
        if ([touch.view isKindOfClass:[UIControl class]]) {
            return NO;
        }
    }
    return YES;
}这样就当我们点击UIControl子类的控件UIButton、UITextField、UISlider等时可以把我们触摸取消,使得控件正常使用。




    
[2] 【Google官方教程】前言:高效地显示Bit地图(位图)
    来源: 互联网  发布时间: 2014-02-18
【Google官方教程】前言:高效地显示Bitmap(位图)

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) 

http://blog.csdn.net/floodingfire/article/details/8166504

译者:Ryan Hoo

来源:https://developer.android.com/develop/index.html

译者按: 在Google最新的文档中,提供了一系列含金量相当高的教程。因为种种原因而鲜为人知,真是可惜!Ryan将会细心整理,将之翻译成中文,希望对开发者有所帮助。

        本系列是Google关于展示大Bitmap(位图)的官方演示,可以有效的解决内存限制,更加有效的加载并显示图片,同时避免让人头疼的OOM(Out Of Memory)。

-------------------------------------------------

译文:

        这一系列教程覆盖了一些用于处理和加载Bitmap(位图)对象的常用技术,在某种程度上,使用这些技术可以使你的用户接口(UI)组件保持良好的响应性能,并且避免超出程序内存限制。如果你不小心翼翼,这些位图对象可以迅速消耗你的可用内存,并引起严重的错误而导致程序崩溃:java.lang.OutofMemoryError: bitmap size exceeds VM budget. 

          这里有一堆的原因向你解释为什么在Android应用中加载Bitmap会如此棘手: 

             · 移动设备一般只有有限的系统资源。Android设备为单个应用分配的可用内存仅为16M。在Android兼容性说明文档(Android Compatibility Definition Document(CDD))的3.7章————虚拟设备的兼容性中,给出了不同屏幕尺寸和密度的手机所需要的最小内存。在有着最小内存限制条件下,应用应该对性能进行优化处理。但是请记住,很多设备的配置要高于这个限制。

             · Bitmap(位图)尤其是一些像照片这种丰富的图片,需要占用大量的内存。例如,Galaxy Nexus摄像头拍摄的照片为2592*1936px(5百万像素)。如果使用ARGB_8888(Android2.3之前的默认配置)加载该位图,需要占用19M的内存(2592*1936*4),立马将一些设备的单个应用内存消耗一空。 

            · Android应用的UI经常需要一次加载很多图片。像ListView、GridView和ViewPager这种组件通常包含许多在屏幕上显示的位图,并且还有很多潜藏在屏幕之外的图片,准备在屏幕滑动的时候显示出来。 

    要解决这些问题,你需要学习如下课程:

-------------------------------------------------

第一课:高效地加载大Bitmap

        这节课将带你贯穿各种以不超过应用的内存限制的方式解码大Bitmap。

第二课:在非UI线程中处理Bitmap

        Bitmap处理(改变图片尺寸,远程下载等等)不应该在UI线程中进行。这节课将带你学习使用AsyncTask在后台线程进行图片处理并且阐述如何处理并发问题。

缓存Bitmap 

    这节课将教会你使用内存和硬盘两种方式缓存Bitmap来提升在加载多个Bitmap使UI的响应性和流畅性。

在你的UI中显示Bitmap

    这节课将所有东西综合起来,向你展示如何使用后台线程和Bitmap缓存,加载多个Bitmap到ViewPager和GridView这样的组件中去。



    
[3] gallery3d的源码分析——通道口2
    来源: 互联网  发布时间: 2014-02-18
gallery3d的源码分析——入口2
@Override
    public void onPause() {
        super.onPause();
        if (mRenderView != null)
            mRenderView.onPause();
        if (mWakeLock != null) {
            if (mWakeLock.isHeld()) {
                mWakeLock.release();
            }
            mWakeLock = null;
        }
        mPause = true;
    }


我们上篇分析了gallery3d的入口,主要集中在gallery.java这个文件里面。

 

上次我们主要分析了onCreate()函数,我们知道Gallery这个类继承Activity,那么Activity的其他函数呢?

 

首先分析onResume这个函数。

public void onResume() {
        super.onResume();
        if (mDockSlideshow) {
            if (mWakeLock != null) {
                if (mWakeLock.isHeld()) {
                    mWakeLock.release();
                }
            }
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "GridView.Slideshow.All");
            mWakeLock.acquire();
            return;
        }
        Log.i(TAG, "Gallery:onResume");
        if (ImageManager.hasStorage()) {
            CacheService.computeDirtySets(this);
            CacheService.startCache(this, false);
        }
        if (mRenderView != null) {
            mRenderView.onResume();
        }
        if (mPause) {
            // We check to see if the authenticated accounts have changed, and
            // if so, reload the datasource.
            HashMap<String, Boolean> accountsEnabled = PicasaDataSource.getAccountStatus(this);
            String[] keys = new String[accountsEnabled.size()];
            keys = accountsEnabled.keySet().toArray(keys);
            int numKeys = keys.length;
            for (int i = 0; i < numKeys; ++i) {
                String key = keys[i];
                boolean newValue = accountsEnabled.get(key).booleanValue();
                boolean oldValue = false;
                Boolean oldValObj = mAccountsEnabled.get(key);
                if (oldValObj != null) {
                    oldValue = oldValObj.booleanValue();
                }
                if (oldValue != newValue) {
                    // Reload the datasource.
                    if (mGridLayer != null)
                        mGridLayer.setDataSource(mGridLayer.getDataSource());
                    break;
                }
            }
            mAccountsEnabled = accountsEnabled;
            mPause = false;
        }
    }

mDockSlideshow这个变量是说如果用户以slideshow方式浏览图片时,设置为true。这个时候要求保持屏幕全亮和CPU运行:


PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "GridView.Slideshow.All");
            mWakeLock.acquire();


mDockSlideshowmDockSlideshow接来下检查是否有新的相册:

if (ImageManager.hasStorage()) {
            CacheService.computeDirtySets(this);
            CacheService.startCache(this, false);
        }

不过这个有个小问题,因为第一次介入gallery3d的时候,onCreate开启了一个线程,线程里面同样检查是否有新的相册。我们知道Activity的生命周期是onCreate->onStart->onResume->Activity is running。所以这里最好做一个改动:

 

if(GalleryisCreated)
{
       if (ImageManager.hasStorage()) {
            CacheService.computeDirtySets(this);
            CacheService.startCache(this, false);
        }
}

这里检查是否有新的相册,是基于这样的场景考虑的:用户使用gallery3d浏览图片或者视频,这时候用户突然想拍一个照片,按了Home键,galler3d的生命周期就是这样onPause->onStop。拍完照片后,用户再次进入gallery3d,这时候执行onRestart->onStart->onResume等动作,这时候就需要加入新的相册了。

 

接下来调用RenderView的onResume了。


if (mRenderView != null) {
            mRenderView.onResume();
        }

最后一段的处理是针对picasa数据源的。如果用户切换了用户名,需要重新加载数据。

 

再来看看onPause函数:

 

@Override
    public void onPause() {
        super.onPause();
        if (mRenderView != null)
            mRenderView.onPause();
        if (mWakeLock != null) {
            if (mWakeLock.isHeld()) {
                mWakeLock.release();
            }
            mWakeLock = null;
        }
        mPause = true;
    }

调用了RenderView的onPause函数,另外释放屏幕和CPU控制。

 

onStop函数又做了什么事情呢?

@Override
    public void onStop() {
        super.onStop();
        if (mGridLayer != null)
            mGridLayer.stop();
        if (mReverseGeocoder != null) {
            mReverseGeocoder.flushCache();
        }
        LocalDataSource.sThumbnailCache.flush();
        LocalDataSource.sThumbnailCacheVideo.flush();
        PicasaDataSource.sThumbnailCache.flush();
        CacheService.startCache(this, true);
    }

调用GridLayer的stop函数,接着将数据写入如下索引文件:地址cache索引文件,本地文件的相册和视频cache索引文件,picasa源的cache索引文件。

同时在后台启动service,构造缩略图的索引。

@Override
    public void onDestroy() {
        // Force GLThread to exit.
        setContentView(R.layout.main);
        if (mGridLayer != null) {
            DataSource dataSource = mGridLayer.getDataSource();
            if (dataSource != null) {
                dataSource.shutdown();
            }
            mGridLayer.shutdown();
        }
        if (mReverseGeocoder != null)
            mReverseGeocoder.shutdown();
        if (mRenderView != null) {
            mRenderView.shutdown();
            mRenderView = null;
        }
        mGridLayer = null;
        super.onDestroy();
        Log.i(TAG, "onDestroy");
    }

onDestroy函数设置当前view为main。main是一个空布局的view。接着切断数据源,停掉数据监听和导入线程,停掉地址计算线程,停止页面更新。

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (mRenderView != null) {
            return mRenderView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
        } else {
            return super.onKeyDown(keyCode, event);
        }
    }

Gallery的键盘事件处理都移交给了RenderView的键盘事件处理。

 

 


 

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪Android双击返回键退出程序的实现方法 iis7站长之家
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3