Android - Creating Resizable View

↘锁芯ラ 提交于 2019-12-22 06:39:32

问题


I am currently working on a Dashboard with movable and resizable views. The problem I have now is that I want to resize the view by touch gestures. Therefore, I thought of a Point which I add to a view on selection, which can be dragged to resize the selected view. This is similar to the resizing procedure on the Android Homescreen.

Even after a long research, I could not come up with a solution on how to overlay another view, which has its own DragListener. I could imagine putting the selected view and the point into one ViewGroup and having the Point overlay the View. Did someone have experience with this problem? Thank you in advance.


回答1:


Try following class.

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;
}
}

I designed this class for vertical resizing only. You need to change onTouch method to suit your case.




回答2:


Change the onTouch() in Mayank's answer as follows

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;
}


来源:https://stackoverflow.com/questions/35433921/android-creating-resizable-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!