【问题标题】:How to decrease popup size gradually while dragging in android?在android中拖动时如何逐渐减小弹出窗口的大小?
【发布时间】:2014-05-19 14:04:45
【问题描述】:

我需要创建一个演示,其中会出现一个弹出窗口,当用户拖动该弹出窗口时,它的大小会逐渐减小。大小取决于用户拖动时所覆盖的距离。该功能类似于 PAPER 应用程序(FACEBOOK)。 我可以通过以下代码拖动弹出窗口。但是代码无法减小弹出窗口的大小,同时拖动它会减小弹出窗口释放时的大小。

public class MainActivity extends Activity implements OnTouchListener,
        OnDragListener {
    private static final String LOGCAT = null;
    private LayoutParams layoutParams;

    ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img = (ImageView) findViewById(R.id.textView1);
        img.setOnTouchListener(this);
        findViewById(R.id.pinkLayout).setOnDragListener(this);
        findViewById(R.id.yellowLayout).setOnDragListener(this);
    }

    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
            layoutParams = (LayoutParams) img.getLayoutParams();
            DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            view.startDrag(null, shadowBuilder, view, 0);
            view.setVisibility(View.INVISIBLE);
            return true;
        } else {
            return false;
        }
    }

    public boolean onDrag(View layoutview, DragEvent dragevent) {
        int action = dragevent.getAction();
        switch (action) {

        case DragEvent.ACTION_DRAG_LOCATION:

            Toast.makeText(getApplicationContext(), "" + dragevent.getX(),
                    Toast.LENGTH_SHORT).show();

            layoutParams.height = (int) dragevent.getX();
            layoutParams.width = (int) dragevent.getX();

            img.setLayoutParams(layoutParams);

            break;

        case DragEvent.ACTION_DRAG_STARTED:

            System.out.println("Action drag started");

            /*
             * Log.d(LOGCAT, "Drag event started");
             * 
             * System.out.println("Drag event started");
             */

            break;
        case DragEvent.ACTION_DRAG_ENTERED:
            System.out.println("Action drag entered");
            /*
             * System.out.println("Drag event entered into " +
             * layoutview.toString()); Log.d(LOGCAT, "Drag event entered into "
             * + layoutview.toString());
             */
            break;
        case DragEvent.ACTION_DRAG_EXITED:
            System.out.println("Action drag exited");
            /*
             * System.out.println("Drag event exited from " +
             * layoutview.toString());
             * 
             * Log.d(LOGCAT, "Drag event exited from " + layoutview.toString());
             */
            break;
        case DragEvent.ACTION_DROP:
            System.out.println("Action drag drop");
            // Log.d(LOGCAT, "Dropped");
            View view = (View) dragevent.getLocalState();
            ViewGroup owner = (ViewGroup) view.getParent();
            owner.removeView(view);
            LinearLayout container = (LinearLayout) layoutview;
            container.addView(view);
            view.setVisibility(View.VISIBLE);
            break;
        case DragEvent.ACTION_DRAG_ENDED:

            System.out.println("Action drag ended");

            /* Log.d(LOGCAT, "Drag ended"); */
            break;
        default:
            break;
        }
        return true;
    }
}

谁能告诉我应该如何处理我的存在代码来实现上述功能。谢谢

【问题讨论】:

    标签: android popup resize drag


    【解决方案1】:

    为了让我的回答 100% 准确,我需要了解更多关于您的应用程序工作的详细信息。根据您所写的内容,我假设“弹出窗口”会在您的手指下移动,并且您希望在移动它时调整它的大小。

    解决方案非常简单。要做到这一点,您必须做两件事:

    1. 创建一个虚拟阴影构建器类,这样当您移动视图时它不会显示任何阴影(更改阴影大小很棘手,但据我了解,您根本不需要阴影......)。你可以这样做:

      public class DummyShadowBuilder extends View.DragShadowBuilder {
      
          @Override
          public void onDrawShadow(Canvas canvas) {
          }
      
          @Override
          public void onProvideShadowMetrics(Point shadowSize, Point touchPoint) {
          }
      }
      

      并将其用作您的阴影构建器进行拖动:

      DummyShadowBuilder shadowBuilder = new DummyShadowBuilder();
      view.startDrag(null, shadowBuilder, view, 0);
      
    2. 控制内部拖拽视图的大小和位置

      case DragEvent.ACTION_DRAG_LOCATION
      

      使用旧代码的示例:

      public boolean onDrag(View layoutview, DragEvent dragevent) {
          int action = dragevent.getAction();
          switch (action) {
              case DragEvent.ACTION_DRAG_LOCATION:
                  //CONTROL POSITION AND SIZE OF DRAGGED VIEW
      
                  //EXAMPLE USING YOUR OLD CODE (previously in ACTION_DRAG_ENDED):
                  int x = (int) dragevent.getX();
                  int y = (int) dragevent.getY();
      
                  layoutParams.height = x;
                  layoutParams.width = x;
      
                  img.setLayoutParams(layoutParams);
      
                  View view = (View) dragevent.getLocalState();
                  ViewGroup owner = (ViewGroup) view.getParent();
                  owner.removeView(view);
                  LinearLayout container = (LinearLayout) layoutview;
                  container.addView(view);
                  view.setVisibility(View.VISIBLE);
      
                  break;
              case DragEvent.ACTION_DRAG_STARTED:
                  break;
              case DragEvent.ACTION_DRAG_ENTERED:
                  break;
              case DragEvent.ACTION_DRAG_EXITED:
                  break;
              case DragEvent.ACTION_DROP:
                  break;
              case DragEvent.ACTION_DRAG_ENDED:
                  break;
              default:
                  break;
              }
          return true;
      }
      

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多