【问题标题】:How does Facebook Messenger draw a chathead? (Android)Facebook Messenger 如何绘制聊天头? (安卓)
【发布时间】:2014-02-25 08:40:51
【问题描述】:

我知道这已经在 StackOverflow 上被问过很多次了,但我对 Facebook Messenger 如何绘制 Chatheads 很着迷。

我按照tutorial 将 ImageView 放置为叠加层。但是,拖动它非常很慢,不像 Chatheads 显示极其流畅的动画。

在开发者选项中打开“显示 GPU 视图更新”选项会在拖动聊天头时使屏幕闪烁。但是,拖动我的 ImageView 不会触发任何闪烁。

这是一个小截屏视频:https://dl.dropboxusercontent.com/u/13595927/temp/TRIM_20140225_134543.mp4

我尝试将图层类型设置为LAYER_TYPE_SOFTWARE,但没有任何改变。我还缺少什么?

【问题讨论】:

    标签: android facebook android-layout android-imageview android-windowmanager


    【解决方案1】:

    我喜欢 facebook messenger 的聊天头:
    https://github.com/henrychuangtw/FB-ChatHead

    • 拖动和弹跳动画


    • 信使:显示文本和发送文本



      • 长按停止

    【讨论】:

    • 遗憾的是,通过 LayoutParams 更新聊天头的位置并不像 Facebook 那样流畅。
    【解决方案2】:

    这是我的简单解决方案: 1)创建一个Service(不要忘记在Manifest.xml中添加它)。

    2) 添加要在窗口上绘制的 ImageView(或其他视图)。您必须通过 LayoutParams 的初始化来准确指定屏幕上的位置。

    3) 将 OnTouchListener 添加到要移动的 View 中,然后在 MotionEvent.ACTION_UP 中计算(这是您放下 View 时),当您必须将其从屏幕上移除时(在我的情况下,当皱巴巴的纸在回收中时)垃圾箱)。

    4) 不要忘记在你的 Manifest.xml 中添加以下代码 sn-p:

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    

    5) 不要忘记删除您在 Service 中的 onDestroy() 中绘制的所有视图:

    @Override
    public void onDestroy() {
        super.onDestroy();
    
        // remove views on destroy!
        if (ivCrumpledPaper != null) {
            mWindowManager.removeView(ivCrumpledPaper);
            ivCrumpledPaper = null;
        }
    
        if (ivRecycleBin != null) {
            mWindowManager.removeView(ivRecycleBin);
            ivRecycleBin = null;
        }
    }
    

    6) 结果如下:

    7) 我创建了一篇博文,其中包含更多详细信息和完整代码 - here

    【讨论】:

    • 很抱歉,但这种技术与 Facebook 实现的流畅度还差得很远:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多