如何在Android中使用可移动元素正确更新布局?

拉斐尔·斯库比斯(Rafael Skubisz)

今天,我试图创建一个具有4个ImageViews和一个ListView的布局,并根据ImageView的位置更新listview的位置。

一个SS向您展示我正在尝试做的事情:

在此处输入图片说明 在此处输入图片说明

如您所见,一旦我们拉动“灰色手柄”,ListView位置就会更新。一切正常,但是在移动手柄时图形不平滑但结结巴巴。

我用于此的代码如下所示;

btn.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent me) {
            if (me.getAction() == MotionEvent.ACTION_DOWN) {
                status = START_DRAGGING;
            }
            if (me.getAction() == MotionEvent.ACTION_UP) {
                status = STOP_DRAGGING;
                Log.i("Drag", "Stopped Dragging");
            } else if (me.getAction() == MotionEvent.ACTION_MOVE) {
                if (status == START_DRAGGING) {
                    System.out.println("Dragging");

                    GestureImageView image1 = (GestureImageView) findViewById(R.id.image1);
                    GestureImageView image2 = (GestureImageView) findViewById(R.id.image2);

                    ImageView header = (ImageView) findViewById(R.id.imageHeader);

                    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.WRAP_CONTENT,
                            RelativeLayout.LayoutParams.WRAP_CONTENT);

                    lp.addRule(RelativeLayout.CENTER_HORIZONTAL);
                    margin1 = (int) me.getRawY() - 100;
                    if (margin1 < header.getHeight() - btn.getHeight() / 3)
                        margin1 = header.getHeight() - btn.getHeight() / 3;
                    else if (margin1 > layout.getHeight() - 1.5
                            * btn.getHeight() - btn3.getHeight())
                        margin1 = (int) (layout.getHeight() - 1.5
                                * btn.getHeight() - btn3.getHeight());
                    lp.topMargin = margin1;
                    btn.setLayoutParams(lp);

                    if (margin1 >= margin2 - 35) {
                        RelativeLayout.LayoutParams newlp = new RelativeLayout.LayoutParams(
                                RelativeLayout.LayoutParams.WRAP_CONTENT,
                                RelativeLayout.LayoutParams.WRAP_CONTENT);

                        newlp.addRule(RelativeLayout.CENTER_HORIZONTAL);
                        margin2 = margin1 + 35;
                        newlp.topMargin = margin2;
                        btn2.setLayoutParams(newlp);

                        RelativeLayout.LayoutParams newlp2 = new RelativeLayout.LayoutParams(
                                RelativeLayout.LayoutParams.WRAP_CONTENT,
                                RelativeLayout.LayoutParams.FILL_PARENT);
                        newlp2.addRule(RelativeLayout.ABOVE, btn2.getId());
                        newlp2.addRule(RelativeLayout.BELOW, header.getId());
                        newlp2.bottomMargin = -(15 + margin2);
                        image2.setLayoutParams(newlp2);
                        image2.setAdditionalY(image2.getHeight(),
                                margin2 - 85, image2.getScaledHeight()
                                        - margin2 - 85);
                    }

                    RelativeLayout.LayoutParams lp3 = new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.WRAP_CONTENT,
                            RelativeLayout.LayoutParams.FILL_PARENT);
                    lp3.addRule(RelativeLayout.ABOVE, btn.getId());
                    lp3.addRule(RelativeLayout.BELOW, header.getId());
                    lp3.bottomMargin = -(15 + margin1);
                    image1.setLayoutParams(lp3);
                    image1.setAdditionalY(image1.getHeight(), margin1 - 50,
                            image1.getScaledHeight() - margin1 - 50);
                }
            }
            return false;
        }
    });

如您所见,我向“灰色手柄”添加了一个侦听器,并在移动时更新了“布局”规则并计算了边距。有一个更好的方法吗?

提前致谢,以帮助我。

EDIT: I forgot to add that the bigger the listView the bigger the stutter and I think it's caused by the listView rebuilding all views while changing its position.

EDIT2: I did some testing, added logs and while moving the listview, all views get rebuilt everytime the listview moves. Is there a way to stop this? Maybe make it rebuild once the user stops moving the images?

Rafael Skubisz

Solved the problem by optimizing "getView" in my ListView.

For everyone that has problems with listViews:

  1. If convertView exists dont create a new view
  2. Use ViewHolders
  3. Never create a Typeface in getView, create all typefaces on calling the constructor
  4. If you fill the List with data from a database create a class where you will be keeping all needed data, instead of calling the DB every new view is created.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在android布局中使用视图?

来自分类Dev

如何在Android中使表格布局行可滚动?

来自分类Dev

如何在Android中使表格布局行可滚动?

来自分类Dev

如何在相对布局中使用边框(可绘制)?

来自分类Dev

如何在 Fragment 类中使用布局元素

来自分类Dev

如何在Android中使用库项目中的布局文件

来自分类Dev

Android:如何在线性布局中使一个元素位于其他元素的前面?

来自分类Dev

如何在Android中使用元素标签查找xml元素

来自分类Dev

如何在React中使用setState更新数组元素?

来自分类Dev

如何在Android中使布局背景闪烁

来自分类Dev

如何在Android中使布局背景闪烁

来自分类Dev

如何在 Xcode 的 Interface Builder 中使用约束/自动布局来正确缩放图像和字体?

来自分类Dev

如何在Android模拟器中模拟真正的外部SD(更新:可移动存储)卡

来自分类Dev

如何在XML布局中使用Roboto

来自分类Dev

如何在盒子布局中使用VerticalGlue

来自分类Dev

如何在graphstream中使用静态布局

来自分类Dev

如何在Aurelia中使用布局?

来自分类Dev

如何在盒子布局中使用VerticalGlue

来自分类Dev

在Android Studio中从相对布局移动元素时,如何停止其他元素的移动?

来自分类Dev

如何在 android 9 中使用 UIAUTOMATOR 检查元素

来自分类Dev

如何在C#中使用EA插件在包之间移动现有元素?

来自分类Dev

如何在PHP中使用已知数组键重移动数组元素?

来自分类Dev

如何在 Android 中的布局之间移动 textViews?

来自分类Dev

如何在 Ruby 中使用带引号的可打印编码正确解码字符串

来自分类Dev

如何在Android中使用PHP MYSQL更新数据

来自分类Dev

如何在Android中使用ASyncTask更新CustomAdapter

来自分类Dev

如何在Android中使用更新语句

来自分类Dev

如何在Android中使用sqlite获取更新的行数?

来自分类Dev

如何在java类中以编程方式使用<merge>标签而不在android中使用xml布局?

Related 相关文章

  1. 1

    如何在android布局中使用视图?

  2. 2

    如何在Android中使表格布局行可滚动?

  3. 3

    如何在Android中使表格布局行可滚动?

  4. 4

    如何在相对布局中使用边框(可绘制)?

  5. 5

    如何在 Fragment 类中使用布局元素

  6. 6

    如何在Android中使用库项目中的布局文件

  7. 7

    Android:如何在线性布局中使一个元素位于其他元素的前面?

  8. 8

    如何在Android中使用元素标签查找xml元素

  9. 9

    如何在React中使用setState更新数组元素?

  10. 10

    如何在Android中使布局背景闪烁

  11. 11

    如何在Android中使布局背景闪烁

  12. 12

    如何在 Xcode 的 Interface Builder 中使用约束/自动布局来正确缩放图像和字体?

  13. 13

    如何在Android模拟器中模拟真正的外部SD(更新:可移动存储)卡

  14. 14

    如何在XML布局中使用Roboto

  15. 15

    如何在盒子布局中使用VerticalGlue

  16. 16

    如何在graphstream中使用静态布局

  17. 17

    如何在Aurelia中使用布局?

  18. 18

    如何在盒子布局中使用VerticalGlue

  19. 19

    在Android Studio中从相对布局移动元素时,如何停止其他元素的移动?

  20. 20

    如何在 android 9 中使用 UIAUTOMATOR 检查元素

  21. 21

    如何在C#中使用EA插件在包之间移动现有元素?

  22. 22

    如何在PHP中使用已知数组键重移动数组元素?

  23. 23

    如何在 Android 中的布局之间移动 textViews?

  24. 24

    如何在 Ruby 中使用带引号的可打印编码正确解码字符串

  25. 25

    如何在Android中使用PHP MYSQL更新数据

  26. 26

    如何在Android中使用ASyncTask更新CustomAdapter

  27. 27

    如何在Android中使用更新语句

  28. 28

    如何在Android中使用sqlite获取更新的行数?

  29. 29

    如何在java类中以编程方式使用<merge>标签而不在android中使用xml布局?

热门标签

归档