当前位置:  编程技术>移动开发
本页文章导读:
    ▪应用PopupWindow优化显示效果        使用PopupWindow优化显示效果 在ListView里点击项弹出Dialog这样的状况是比较常见的,但当一个按钮在视图的左上方,点击出现管理菜单时,如果也有Dialog显示,第一,觉得比较丑,第二还得.........
    ▪ 十分难缠的signal 11 (SIGSEGV)        非常难缠的signal 11 (SIGSEGV) 现在很多游戏都是动态模拟物理效果的,而事实证明这样的游戏也相当受欢迎。。。。好吧,又是愤怒的小鸟。。。好吧,Android能实现的,估计也只有Box2D了。.........
    ▪ [转]Objective-C定义的主要类型和常量       [转]Objective-C定义的重要类型和常量 Objective-C使用了很多在ANSI C中找不到的类型和常量(literal)。在某些情况下,这些类型和常量会代替ANSI C的对应部分。表2-1描述一些重要的类型,包.........

[1]应用PopupWindow优化显示效果
    来源: 互联网  发布时间: 2014-02-18
使用PopupWindow优化显示效果
在ListView里点击项弹出Dialog这样的状况是比较常见的,但当一个按钮在视图的左上方,点击出现管理菜单时,如果也有Dialog显示,第一,觉得比较丑,第二还得设置ListView项,或其它的东西,它还有一层灰色遮罩层遮住下面的内容,于是我就用了PopupWindow来处理。
用PopupWindow有一个问题,当你想要它关闭时,通常会想像Dialog那样,在它的范围外点击也关闭,所以要在Activity里面添加一些代码:
@Override
     public boolean dispatchTouchEvent(MotionEvent event) {
         if (mPopupWindow==null||!mPopupWindow.isShowing()) {
             return super.dispatchTouchEvent(event);
         }
         boolean isOut=isOutOfBounds(event);
         Log.d(TAG, "isOut:"+isOut+" event.getAction():"+event.getAction());
         if (event.getAction()==MotionEvent.ACTION_DOWN&&isOut) {
             mPopupWindow.dismiss();
             return true;
         }

         return false;
     }

     /**
      * 计算是否在PopupWindow外面点击
      *
      * @param event
      * @return
      */
     private boolean isOutOfBounds(MotionEvent event) {
         final int x=(int) event.getX();
         final int y=(int) event.getY();
         final int slop=ViewConfiguration.get(Activity2.this).getScaledWindowTouchSlop();
         final View decorView=mPopupWindow.getContentView();
         return (x<-slop)||(y<-slop)
             ||(x>(decorView.getWidth()+slop))
             ||(y>(decorView.getHeight()+slop));
     }

 Activity2里面有mPopupWindow。

这样就可以了,当你点击PopupWindow外的区域,会关闭的,注意有一点,如果使用ActivityGroup,在切换标签时,有时不会关闭,所以我只能在onPause里把它手动关闭了。

剩下的就是PopupWindow了,用这个词搜索,多数的代码总是有那么一段是相同的,而且没有讲到重点。
点击左右上方的按钮,调用显示PopupWindow:
private void showPopupWindow(View parent) {
        if (null==mPopupWindow) {
            initPopuptWindow();
        }

        if (groupId==-1||groupId==-2) {
            editGroup.setVisibility(View.GONE);
            addGroupMember.setVisibility(View.GONE);
            delGroupMember.setVisibility(View.GONE);
            delGroup.setVisibility(View.GONE);
        } else {
            editGroup.setVisibility(View.VISIBLE);
            addGroupMember.setVisibility(View.VISIBLE);
            delGroupMember.setVisibility(View.VISIBLE);
            delGroup.setVisibility(View.VISIBLE);
        }
        mPopupWindow.showAsDropDown(parent);
parent就是点击的按钮,showAsDropDown这个方法会自动计算显示的位置在parent下面。
    }

private void initPopuptWindow() {
        View popupWindow_view=getLayoutInflater().inflate(
            R.layout.popup_win, null, false);

        mPopupWindow=new PopupWindow(popupWindow_view);
        mPopupWindow.setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);

这点很重要,如果你用的是PopupWindow(width,height)这样的构造方法,出现的东西就是固定高宽的,显示不是所需要的。设置这样的布局参数后,会自动处理布局的大小。

        //mPopupWindow.setOutsideTouchable(false); 这句似乎没有太多效果,查看源码,没发现什么好处。

        addContact=(Button) popupWindow_view.findViewById(R.id.add_contact);
        addGroup=(Button) popupWindow_view.findViewById(R.id.add_group);
        editGroup=(Button) popupWindow_view.findViewById(R.id.edit_group);
        addGroupMember=(Button) popupWindow_view.findViewById(R.id.add_group_member);
        delGroupMember=(Button) popupWindow_view.findViewById(R.id.del_group_member);
        delGroup=(Button) popupWindow_view.findViewById(R.id.del_group);
        
        addContact.setOnClickListener(popupItemClickListener);
        addGroup.setOnClickListener(popupItemClickListener);
        editGroup.setOnClickListener(popupItemClickListener);
        addGroupMember.setOnClickListener(popupItemClickListener);
        delGroupMember.setOnClickListener(popupItemClickListener);
        delGroup.setOnClickListener(popupItemClickListener);
    }

然后就是一个监听器了:
mPopupWindow.dismiss();
            switch (view.getId()){
                case R.id.add_contact: //添加
                    break;
                
                case R.id.add_group:  //创建
                    break;
}
、。。。。。。。。。。
}

这样处理有点傻,因为我的布局文件 里存着固定的按钮。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:gravity="center"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:background="@drawable/management_menu_bg" android:layout_margin="0dip">

    <Button android:id="@+id/add_contact" android:textColor="@color/white"
        android:text="@string/add_contact" android:background="@drawable/popup_bg"
        android:layout_width="wrap_content" android:layout_height="36dip"
        android:padding="4dip"/>

    <Button android:id="@+id/add_group" android:textColor="@color/white"
        android:text="@string/add_group" android:background="@drawable/popup_bg"
        android:layout_width="fill_parent" android:layout_height="36dip"
        android:padding="4dip"/>

    <Button android:id="@+id/edit_group" android:textColor="@color/white"
        android:text="@string/edit_group_name" android:background="@drawable/popup_bg"
        android:layout_width="fill_parent" android:layout_height="36dip"
        android:padding="4dip"/>

    <Button android:id="@+id/add_group_member" android:textColor="@color/white"
        android:text="@string/group_add_member" android:background="@drawable/popup_bg"
        android:layout_width="fill_parent" android:layout_height="36dip"
        android:padding="4dip"/>

    <Button android:id="@+id/del_group_member" android:textColor="@color/white"
        android:text="@string/group_del_member" android:background="@drawable/popup_bg"
        android:layout_width="fill_parent" android:layout_height="36dip"
        android:padding="4dip"/>

    <Button android:id="@+id/del_group" android:textColor="@color/white"
        android:text="@string/del_group" android:background="@drawable/popup_bg"
        android:layout_width="fill_parent" android:layout_height="36dip"
        android:padding="4dip"/>
</LinearLayout>  

因为功能相对固定,所以一次性把所有的按钮添加到布局文件中,在初始化时控制着显示与隐藏了。有点弱弱。
效果图如下:


    
[2] 十分难缠的signal 11 (SIGSEGV)
    来源: 互联网  发布时间: 2014-02-18
非常难缠的signal 11 (SIGSEGV)
现在很多游戏都是动态模拟物理效果的,而事实证明这样的游戏也相当受欢迎。。。。好吧,又是愤怒的小鸟。。。
好吧,Android能实现的,估计也只有Box2D了。。。
最近解决了一个非常恶心难缠的问题,都快被它给逼疯了~见log

10-28 12:39:17.779: I/DEBUG(7749): Build fingerprint: 'google/passion/passion:2.3.6/GRK39F/189904:user/release-keys'
10-28 12:39:17.779: I/DEBUG(7749): pid: 17414, tid: 17446  >>> com.soybea.rocket <<<
10-28 12:39:17.779: I/DEBUG(7749): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
10-28 12:39:17.779: I/DEBUG(7749):  r0 00000027  r1 deadbaad  r2 a0000000  r3 00000000
10-28 12:39:17.779: I/DEBUG(7749):  r4 00000001  r5 00000000  r6 44bc8c10  r7 44984e64
10-28 12:39:17.779: I/DEBUG(7749):  r8 44bc8b70  r9 44984e54  10 44984e3c  fp 800a5368
10-28 12:39:17.779: I/DEBUG(7749):  ip afd46668  sp 44bc8ae0  lr afd191d9  pc afd15ca4  cpsr 60000030
10-28 12:39:17.779: I/DEBUG(7749):  d0  646f423262287964  d1  6f42796f72747365
10-28 12:39:17.779: I/DEBUG(7749):  d2  646e412f65737062  d3  6850656e69676e32
10-28 12:39:17.779: I/DEBUG(7749):  d4  786f427363697379  d5  736e657478454432
10-28 12:39:17.779: I/DEBUG(7749):  d6  2f696e6a2f6e6f69  d7  79442f4432786f42
10-28 12:39:17.779: I/DEBUG(7749):  d8  42ce94f34e6e6b28  d9  3c8888893c888888
10-28 12:39:17.779: I/DEBUG(7749):  d10 c26f7c303f800000  d11 3fed9bafc26f7e0e
10-28 12:39:17.779: I/DEBUG(7749):  d12 0000000000000000  d13 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749):  d14 0000000000000000  d15 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749):  d16 3ef18d523ae9735c  d17 3fca68bfcfa2d635
10-28 12:39:17.779: I/DEBUG(7749):  d18 bf29fd09783e4216  d19 3ec6cd878c3b46a7
10-28 12:39:17.779: I/DEBUG(7749):  d20 3f826164f3f641b5  d21 3f5e8ec8e86d933e
10-28 12:39:17.779: I/DEBUG(7749):  d22 3e3782e7e0000000  d23 3e33401660000000
10-28 12:39:17.779: I/DEBUG(7749):  d24 3fca99a880000000  d25 bfca99a880000000
10-28 12:39:17.779: I/DEBUG(7749):  d26 be3ff77520000000  d27 3ef99342e0ee5069
10-28 12:39:17.779: I/DEBUG(7749):  d28 bfa2b4442c6a6c2f  d29 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749):  d30 0000000000000000  d31 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749):  scr 80000012
10-28 12:39:17.829: I/DEBUG(7749):          #00  pc 00015ca4  /system/lib/libc.so
10-28 12:39:17.829: I/DEBUG(7749):          #01  pc 0001c92c  /system/lib/libc.so
10-28 12:39:17.829: I/DEBUG(7749):          #02  pc 00026504  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:17.829: I/DEBUG(7749):          #03  pc 00013e18  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:17.829: I/DEBUG(7749):          #04  pc 00017e34  /system/lib/libdvm.so
10-28 12:39:17.829: I/DEBUG(7749): code around pc:
10-28 12:39:17.829: I/DEBUG(7749): afd15c84 2c006824 e028d1fb b13368db c064f8df
10-28 12:39:17.829: I/DEBUG(7749): afd15c94 44fc2401 4000f8cc 49124798 25002027
10-28 12:39:17.829: I/DEBUG(7749): afd15ca4 f7f57008 2106ec7c edd8f7f6 460aa901
10-28 12:39:17.829: I/DEBUG(7749): afd15cb4 f04f2006 95015380 95029303 e93ef7f6
10-28 12:39:17.829: I/DEBUG(7749): afd15cc4 462aa905 f7f62002 f7f5e94a 2106ec68
10-28 12:39:17.829: I/DEBUG(7749): code around lr:
10-28 12:39:17.829: I/DEBUG(7749): afd191b8 4a0e4b0d e92d447b 589c41f0 26004680
10-28 12:39:17.829: I/DEBUG(7749): afd191c8 686768a5 f9b5e006 b113300c 47c04628
10-28 12:39:17.829: I/DEBUG(7749): afd191d8 35544306 37fff117 6824d5f5 d1ef2c00
10-28 12:39:17.829: I/DEBUG(7749): afd191e8 e8bd4630 bf0081f0 00028344 ffffff88
10-28 12:39:17.829: I/DEBUG(7749): afd191f8 b086b570 f602fb01 9004460c a804a901
10-28 12:39:17.829: I/DEBUG(7749): stack:
10-28 12:39:17.829: I/DEBUG(7749):     44bc8aa0  afd42664 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8aa4  000a7d18 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8aa8  00000015 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8aac  afd182a1  /system/lib/libc.so
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ab0  afd4270c 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ab4  afd426b8 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ab8  00000000 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8abc  afd191d9  /system/lib/libc.so
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ac0  00000001 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ac4  44bc8af4 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ac8  44bc8c10 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8acc  44984e64 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ad0  44bc8b70 
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ad4  afd184fb  /system/lib/libc.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8ad8  df002777 
10-28 12:39:17.839: I/DEBUG(7749):     44bc8adc  e3a070ad 
10-28 12:39:17.839: I/DEBUG(7749): #00 44bc8ae0  44984e54 
10-28 12:39:17.839: I/DEBUG(7749):     44bc8ae4  44984e3c 
10-28 12:39:17.839: I/DEBUG(7749):     44bc8ae8  800a5368 
10-28 12:39:17.839: I/DEBUG(7749):     44bc8aec  afd18821  /system/lib/libc.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8af0  afd426b8 
10-28 12:39:17.839: I/DEBUG(7749):     44bc8af4  fffffbdf 
10-28 12:39:17.839: I/DEBUG(7749):     44bc8af8  afd1c92d  /system/lib/libc.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8afc  afd3ade9  /system/lib/libc.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b00  80540c00  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b04  afd1c931  /system/lib/libc.so
10-28 12:39:17.839: I/DEBUG(7749): #01 44bc8b08  0000006c 
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b0c  80540f08  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b10  80540f08  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b14  44bc8b90 
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b18  00000000 
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b1c  80526508  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:18.839: I/DEBUG(7749): debuggerd committing suicide to free the zombie!
10-28 12:39:18.839: I/BootReceiver(96): Copying /data/tombstones/tombstone_03 to DropBox (SYSTEM_TOMBSTONE)
10-28 12:39:18.879: I/DEBUG(17474): debuggerd: Sep 20 2011 11:21:24

首先,你得承认经常看到这样的log是要崩溃的。。。。
没有任何debug信息,你不知道是哪句出错了,你只知道,深层的so调用出问题了。。。
而你基本不可能再去修改这些文件去适应你的程序,因为
1. 能力不足
2. 即使实力超群,投入产出比也相当的不经济,有这些精力解决自己的程序才是正道~
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad,在使用box2d extension的时候你有可能会经常遇到这样的问题,尤其是当你的应用比较大,比较复杂的时候~
在下才疏学浅,只好用最土的办法,隔行打log。。。。
经过无数次的研究尝试,总结出如下规律~

它通常发生在
1. 创建Body
2. 移动Body
3. 删除Body
4. ContactListener
5. 手动设置Body对象为null
6. 还没遇到。。。。

深层次原因
同样经过无数次的试验和失败,几次挑灯夜战,越过重重GFW,翻阅无数资料,发现这类问题,基本都是深层代码的NullPointerReference所导致的

Bug解释
Box2D里有一个arraylist来维护当前所有的body,是在某个线程(可能是当前工作线程)运行的for循环,如果你在某个线程对body做了一些操作(如destory body)就会导致问题出现。。。

如何避免
1. 不要频繁大规模的创建/删除body对象,尽可能复用可以复用的对象,暂时不用的应当设置为不可见,使body sleep
2. 管理好你的线程,永远使用一个相同的线程来创建/管理/修改body对象
3. ContactListener中不要放实际方法,尽量异步调用
4. 设计模式很重要。。。

解决实例
下面是我的解决实例,仅供参考

protected static Queue<Object> deleteQueue=new LinkedList<Object>();
IUpdateHandler deleteUpdateHandler=new IUpdateHandler() {
    @Override
    public void onUpdate(float pSecondsElapsed) {
        if (!deleteQueue.isEmpty()) {
            //Do the delete body work
        }
    }
}
Scene.registerUpdateHandler(deleteUpdateHandler);


同样,你也可以创建多个队列,分别管理你的创建/删除/碰撞检测等操作~

最后,永远不要指望什么灵丹妙药,这些解决方法也不是狗皮膏药,贴了就好,小心的设计你的模式,认真调试代码,否则这个问题会像牛皮癣一样难以彻底根除

祝广大开发者都能更好的完成自己的项目~

    
[3] [转]Objective-C定义的主要类型和常量
    来源: 互联网  发布时间: 2014-02-18
[转]Objective-C定义的重要类型和常量


Objective-C使用了很多在ANSI C中找不到的类型和常量(literal)。在某些情况下,这些类型和常量会代替ANSI C的对应部分。表2-1描述一些重要的类型,包括每个类型允许使用的常量。

表2-1  Objective-C定义的重要类型和常量

类型

描述和文字

id

动态对象类型,否定常量为nil。

Class

动态类的类型,否定常量为Nil。

SEL

选择器的数据类型(typedef)。和ANSI C一样,这种类型的否定常量为NULL。

BOOL

布尔类型。允许的值为YES和NO。













    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪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