我需要创建一个弹出窗口的演示,当用户拖动弹出窗口时,它的大小会逐渐减小。大小取决于拖动时用户所覆盖的距离。功能类似于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;
}
}
任何人都可以告诉我如何处理我的存在代码以实现上述功能。感谢
答案 0 :(得分:0)
对于我100%精确的答案,我需要更多关于您的应用程序工作的详细信息。根据你所写的内容,我认为" popup"将在你的手指下移动,你想在移动时调整它的大小。
解决方案非常简单。你必须做两件事:
创建一个虚拟阴影生成器类,以便在移动视图时不显示任何阴影(更改阴影大小很棘手,但根据我的理解,您根本不需要阴影......)。你可以这样做:
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);
控制
中拖动视图的大小和位置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;
}