我目前正在使用具有可移动和可调整大小视图的仪表板。我现在的问题是我想通过触摸手势调整视图大小。因此,我想到了一个Point,我将其添加到选择视图中,可以拖动它以调整所选视图的大小。这类似于Android主屏幕上的调整大小过程。
即使经过长时间的研究,我也无法想出如何覆盖另一个视图的解决方案,该视图有自己的DragListener。我可以想象将选定的视图和点放入一个ViewGroup并让Point覆盖View。有人有这个问题的经验吗?先感谢您。
答案 0 :(得分:0)
尝试上课。
package mayank.com.bhaktirasamritaswami.ui.components;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;
import mayank.com.bhaktirasamritaswami.R;
public class ResizableLayout extends RelativeLayout implements View.OnTouchListener{
public static int top_margine;
public ResizableLayout(Context context) {
super(context);
init();
}
public ResizableLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public void init(){
addView(inflate(getContext(), R.layout.ui_component_resizable_layout,null));
setOnTouchListener(this);
dragHandle = this.findViewById(R.id.drag_handle);
}
private View dragHandle;
float downRawY;
float dY;
float height;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
if(action == MotionEvent.ACTION_DOWN){
downRawY = motionEvent.getRawY();
height = this.getMeasuredHeight();
} else {
View parent = (View) this.getParent();
if(downRawY<parent.getHeight() - height + 2*dragHandle.getHeight()) {
float rawY = motionEvent.getRawY()>20*dragHandle.getHeight()?motionEvent.getRawY():20*dragHandle.getHeight();
MarginLayoutParams p = (MarginLayoutParams) this.getLayoutParams();
p.topMargin = (int)rawY;
if(p.topMargin!=0)
this.top_margine = p.topMargin;
this.setLayoutParams(p);
}
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent motionEvent){
onTouch(this, motionEvent);
return false;
}
}
我将此类设计为仅用于垂直调整大小。您需要更改onTouch方法以适合您的情况。
答案 1 :(得分:0)
如下更改Mayank答案中的onTouch()
static final int TOP = 1, RIGHT = 2, BOTTOM = 3, LEFT = 4;
int handleMargin = 10, side = 0;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
if(action == MotionEvent.ACTION_DOWN){
// detect if tap is on handles
downRawY = motionEvent.getRawY();
height = this.getMeasuredHeight();
} else {
// change layout margin inside switch
switch(side){
case: ....
}
View parent = (View) this.getParent();
if(downRawY<parent.getHeight() - height + 2*dragHandle.getHeight()) {
float rawY = motionEvent.getRawY()>20*dragHandle.getHeight()?motionEvent.getRawY():20*dragHandle.getHeight();
MarginLayoutParams p = (MarginLayoutParams) this.getLayoutParams();
p.topMargin = (int)rawY;
if(p.topMargin!=0)
this.top_margine = p.topMargin;
this.setLayoutParams(p);
}
}
return false;
}