First Kind
The second Kind
The first method of implementation
XML layout
<relativelayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http// Schemas.android.com/tools " android:layout_width=" match_parent " android:layout_height=" Match_parent " android:orientation= "vertical" > <button android:id= "@+id/startbtn" android:layout_width = "35DP" android:layout_height= "35DP" android:layout_centerinparent= "true" android:background= "@ Drawable/addstock "/></relativelayout>
Activity call
Displaymetrics DM = getresources (). Getdisplaymetrics (); screenwidth = Dm.widthpixels;screenheight = dm.heightPixels;// Toast.maketext (Getactivity (), screenwidth + "= =" + screenheight + "="//+ vheight, 0). Show ();//Drag button btn = (Button) view.f Indviewbyid (R.ID.STARTBTN); Btn.setonclicklistener (new Onclicklistener () {@Overridepublic void OnClick (View v) {// TODO auto-generated Method Stubif (bool) {Latestnetdatapackage lnpackage = new Latestnetdatapackage (r.string.command_ Latestnet, Fundkind, Sorttype,requesttype, Curpage, Fund_count, 0);d atapackage = Lnpackage; Networktaskmanager.addrequesttorequestcache (Lnpackage, Hlistviewfragment.this, Hlistviewfragment.this, Getactivity ()); Btn.setbackgroundresource (r.drawable.deletestock); bool = false;} else {latestnetdatapackage lnpackage = new Latestnetdatapackage (r.string.command_latestnet, FundKind, SortType, RequestType, Curpage, Fund_count, 1);d atapackage = Lnpackage; Networktaskmanager.addrequesttorequestcache (Lnpackage, Hlistviewfragment.this, hlistViewfragment.this,getactivity ()); Btn.setbackgroundresource (r.drawable.addstock); bool = True;}}); Btn.setontouchlistener (New Ontouchlistener () {int lastx, lasty;//record move last position private int Btnheight;public Boolean OnTouch (View V, motionevent event) {//get actionint EA = event.getaction (); switch (EA) {case Motionevent.action_down://Press LASTX = (int) event.getrawx (); lasty = (int) event.getrawy (); screenwidth = View.getwidth (); screenheight = View.getheight ( ); btnheight = Btn.getheight ();//Toast.maketext (Getactivity (), "Action_down:" + Lastx + ",//" + lasty, 0). Show (); Break;ca SE motionevent.action_move://Move//move in dynamic set position int dx = (int) event.getrawx ()-Lastx;int dy = (int) Event.getrawy ()-Lasty ; int left = V.getleft () + dx;int top = v.gettop () + Dy;int right = V.getright () + Dx;int bottom = V.getbottom () + dy;if (l EFT < 0) {left = 0;right = left + V.getwidth ();} if (right > ScreenWidth) {right = Screenwidth;left = Right-v.getwidth ();} if (Top < 0) {top = 0;bottom = top + v.getheight ();} if (Bottom > screenheight) {bottom = Screenheight;top = Bottom-v.getheight ();} V.layout (left, top, right, bottom);//Toast.maketext (Getactivity (), "position:" + Left + "," +//Top + "," + Right + ", + Bottom, 0)//. Show ()//Set the current position again LASTX = (int) event.getrawx (); lasty = (int) event.getrawy (); Break;case motionevent.a CTION_UP://lift//Inward adsorption//int dx1 = (int) event.getrawx ()-Lastx;//int dy1 = (int) Event.getrawy ()-Lasty;//int left1 = V . GetLeft () + dx1;//int Top1 = v.gettop () + dy1;//int right1 = v.getright () + dx1;//int bottom1 = V.getbottom () + dy1;//if (Left1 < (SCREENWIDTH/2)) {//if (Top1 <) {//v.layout (left1, 0, right1, btnheight);/} else if (Bottom1 > (screenHeight-200)) {//v.layout (Left1, (screenheight-btnheight), right1, screenheight),//} else {//v.layout (0, Top1, Btnheight, bottom1);//}//} else {/ /if (Top1 <) {//v.layout (left1, 0, right1, btnheight);/} else if (Bottom1 > (screenHeight-200)) {//v.layout (l EFT1, (Screenheight-btnheigHT), right1, screenheight);/} else {//v.layout ((screenwidth-btnheight), Top1, ScreenWidth, bottom1);//}//}//break;} return false;}});
View refers to the layout
The second method of implementation
XML layout
<com.ui.view.dragframelayout android:id= "@+id/becausefloat" android:layout_width= "Fill_parent " android:layout_height= "0.0DP" android:layout_gravity= "center_vertical" android:layout_weight= "1" > <framelayout android:id= "@+id/container" android:layout_width= "Match_parent" android: layout_height= "0DP" android:layout_weight= "1"/> <imageview android:id= "@+id/dragimg " Android:layout_width= "35DP" android:layout_height= "35DP" android:background= "@drawable/deletestock"/ > </com.ui.view.DragFrameLayout>
Custom Control Com.ui.view.DragFrameLayout
Package Com.ui.view;import Com.ui.r;import Android.content.context;import android.graphics.rect;import Android.location.location;import Android.util.attributeset;import Android.util.log;import Android.view.motionevent;import Android.view.view;import Android.view.viewconfiguration;import Android.widget.framelayout;public class Dragframelayout extends Framelayout {private View view;private int width, heigh; private int Screenwid, screenhei;private boolean Isclickdrag = false;private Boolean Istouchdrag = false;private float STA RtX, starty;private checkclick checkclick = new Checkclick ();p rivate dragimageclicklistener dragimagelistener;public Dragimageclicklistener Getdragimagelistener () {return dragimagelistener;} public void Setdragimagelistener (Dragimageclicklistener dragimagelistener) {This.dragimagelistener = Dragimagelistener;} Public interface Dragimageclicklistener {public abstract void OnClick (); Private class Checkclick implements Runnable {@Overridepublic void Run () {//TODO auto-Generated method Stubisclickdrag = false; LOG.I ("Drag", "=====checktap====");}} Public Dragframelayout (context context, AttributeSet attrs, int defstyle) {Super (context, attrs, defstyle);//TODO Auto-g Enerated Constructor Stub}public dragframelayout (context context, AttributeSet Attrs) {Super (context, attrs);//TODO Auto-generated constructor stub}public void Draginit (view view) {Screenwid = GetWidth (); Screenhei = GetHeight (); width = VI Ew.getwidth (); heigh = View.getheight ();} @Overridepublic boolean onintercepttouchevent (motionevent ev) {//TODO auto-generated method Stubswitch (Ev.getaction () {case MotionEvent.ACTION_DOWN:float x = Ev.getx (); Float y = ev.gety (); Rect frame = new rect (), if (view = = null) {view = Findviewbyid (r.id.dragimg);d raginit (view);} View.gethitrect (frame), if (Frame.contains (int) (x), (int) (y))) {Istouchdrag = True;startx = X;starty = Y;return true;} break;} return false;} @Overrideprotected void OnLayout (Boolean changed, int left, int top, int right,int bottom) {Super. OnLayout (changed, left, top, right, bottom);} @Overridepublic boolean ontouchevent (Motionevent event) {//TODO auto-generated method Stubfloat x = Event.getx (); float y = Event.gety (); Rect frame = new rect (), switch (Event.getaction ()) {case MotionEvent.ACTION_DOWN:view.getHitRect (frame); Frame.contains ((int) (x), (int) (y))) {StartX = X;starty = Y;istouchdrag = True;isclickdrag = true;postdelayed (Checkclick, Viewconfiguration.gettaptimeout ());} Break;case MotionEvent.ACTION_MOVE:float Distanx = Math.Abs (x-startx); float Distany = Math.Abs (Y-starty); if (math.sqrt (Distany * distany + Distanx * Distanx) >) {Isclickdrag = false;} Move (x, y); Break;case MotionEvent.ACTION_CANCEL:isClickDrag = False;istouchdrag = False;break;case motionevent.action _up:if (Isclickdrag = = True) {Dragimagelistener.onclick (); Removecallbacks (Checkclick);} Isclickdrag = False;istouchdrag = false;//This is the control adsorption four weeks//if (x > Width && x < screenwid-width && Y & Gt heigh//&& Y < SCReenhei-heigh) {//int Mintype = mindistance (x, y);//LOG.I ("tags", Screenhei + "==mintype=" + Mintype);//switch (MinType ) {//case left://x = width;//break;//case right://x = screenwid-width;//break;//case top://y = heigh;//break;//case BOTT om://y = Screenhei-heigh;//break;//default://break;//}//move (x, y);//}break;case motionevent.action_outside: Isclickdrag = False;istouchdrag = False;break;} return true;} Private final static int left = 1;private final static int right = 2;private final static int TOP = 3;private final static int BOTTOM = 4;private int mindistance (float x, float y) {log.i ("tags", "x=" + x + "==y=" + y); Boolean left, top;if (x &L T;= (Screenwid-x)) {left = true;} else {left = false;} if (y <= (screenhei-y)) {top = true;} else {top = false;} if (left&&top) {if (x<=y) {return left;} Else{return TOP;}} if (left&& (!top)) {if (x<= (screenhei-y)) {return left;} Else{return BOTTOM;}} if ((!left) &top) {if ((screenwid-x) <= y) {return right;} Else{return TOP;}}if ((!left) & (!top)) {if ((screenwid-x) <= (screenhei-y)) {return right;} Else{return BOTTOM;}} return 0;} private void Move (float x, float y) {int left = (int.) (X-WIDTH/2), int top = (int) (Y-HEIGH/2), if (left <= 0) lef t = 0;if (top <= 0) top = 0;if (Left > screenwid-width) left = screenwid-width;if (Top > Screenhei-heigh) Top = Screenhei-heigh; Framelayout.layoutparams params = (framelayout.layoutparams) view.getlayoutparams ();p Arams.setmargins (left, top, ( Screenwid-left-width), (Screenhei-top-heigh)); View.setlayoutparams (params); Requestlayout ();} Public double getdistance (double lat1, double lon1, double lat2, double lon2) {float[] results = new FLOAT[1]; Location.distancebetween (LAT1, Lon1, LAT2, Lon2, results); return results[0];}}
Activity Invocation Method
Dragimg = (ImageView) Findviewbyid (r.id.dragimg); framelayout = (dragframelayout) Findviewbyid (r.id.becausefloat); Framelayout.setdragimagelistener (New Dragimageclicklistener () {private Boolean isdaix; @Overridepublic void OnClick () {//TODO auto-generated method stubif (Isdaix) {dragimg.setbackgroundresource (r.drawable.deletestock); IsDaix = false;} else {dragimg.setbackgroundresource (r.drawable.addstock); Isdaix = true;} Toast.maketext (Mainactivity.this, "click", Toast.length_long). Show ();});
Android Super Simple Drag button hover Button Snap Button float button