android可拖动控件初探

自从看到控件换位的特效后一直想实现,结果弄出了这个半成品,只对单点触控有用。很简单的一个demo,四个按钮,拖动按钮按钮随手指移动,手指离开界面时计算最近的按钮,决定与哪个互换位置或者自己回到原点

贴图如右

代码:
public class MainActivity extends Activity implements OnTouchListener{
int sl=0,sr=0,st=0,sb=0;
int lastX,lastY;
private Button btn1,btn2,btn3,btn4;
private Button[] btns=new Button[4];
private int mScremWidth,mScremHeight;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn1=(Button)findViewById(R.id.btn1);
        btn1.setOnTouchListener(this);
        btn2=(Button)findViewById(R.id.btn2);
        btn2.setOnTouchListener(this);
        btn3=(Button)findViewById(R.id.btn3);
        btn3.setOnTouchListener(this);
        btn4=(Button)findViewById(R.id.btn4);
        btn4.setOnTouchListener(this);
        btns[0]=btn1;
        btns[1]=btn2;
        btns[2]=btn3;
        btns[3]=btn4;
        DisplayMetrics dm=getResources().getDisplayMetrics();
        mScremWidth=dm.widthPixels;
        mScremHeight=dm.heightPixels-50;
    }
public boolean onTouch(View v, MotionEvent event) {
int eve=event.getAction();
changeset(v,event);
return false;
}
private void changeset(View btnmove,MotionEvent event){
int eve=event.getAction();
switch (eve) {
case MotionEvent.ACTION_DOWN:
lastX=(int)event.getRawX();
lastY=(int)event.getRawY();
sl=btnmove.getLeft();
sr=btnmove.getRight();
st=btnmove.getTop();
sb=btnmove.getBottom();
btnmove.bringToFront();
break;
case MotionEvent.ACTION_MOVE:
int dx=(int)event.getRawX()-lastX;
int dy=(int)event.getRawY()-lastY;
int l=btnmove.getLeft()+dx;
int r=btnmove.getRight()+dx;
int t=btnmove.getTop()+dy;
int b=btnmove.getBottom()+dy;
if(l<0){
l=0;
r=l+btnmove.getWidth();
}
if(r>mScremWidth){
r=mScremWidth;
l=r-btnmove.getWidth();
}
if(t<0){
t=0;
b=t+btnmove.getHeight();
}
if(b>mScremHeight){
b=mScremHeight;
t=b-btnmove.getHeight();
}
btnmove.layout(l, t, r, b);
lastX=(int)event.getRawX();
lastY=(int)event.getRawY();
break;
case MotionEvent.ACTION_UP:
//无偏移坐标不变
int tt=btnmove.getTop();
if(Math.abs(tt-st)>9){
int min=abstop(btnmove);
Button btn=btns[min];
if(btnmove.getId()!=btn.getId()){
btnmove.layout(btn.getLeft(), btn.getTop(),btn.getRight(), btn.getBottom());
btn.layout(sl, st, sr, sb);
}else{
Log.i("bbb","btnmove===btn"+btn.getId());
btnmove.layout(sl, st, sr, sb);
}
}else{
//无偏移坐标归原
btnmove.layout(sl, st, sr, sb);
}
break;
default:
break;
}
}
 //算出非本按钮次小坐标
private int abstop(View bt){
int btl=bt.getBottom();
int[] tops=new int[btns.length];
Log.i("length", "btns.length="+btns.length);
for(int i=0;i<btns.length;i++){
int temp=btns[i].getBottom();
int abs=Math.abs(btl-temp);
Log.i("abs", "btns["+i+"],abs==="+abs);
tops[i]=abs;
}
int min=0;
int index=0;
int indexz=0;
for(int i=0;i<tops.length;i++){
if(tops[i]==0){
indexz=i;
}
}
int[] temp=tops;
for(int i=0;i<temp.length;i++){
for(int j=i+1;j<temp.length;j++){
if(temp[i]>temp[j]){
int t=temp[i];
temp[i]=temp[j];
temp[j]=t;
}
}
}
// //确保都为0是temp[1]不是按钮本身 此处处理让不能底部重合
// if(temp[1]!=0){
min=temp[1];
// }
Log.i("min", "min=="+min);
tops=new int[btns.length];
Log.i("length", "btns.length="+btns.length);
for(int i=0;i<btns.length;i++){
int tem=btns[i].getBottom();
int abs=Math.abs(btl-tem);
Log.i("abs", "btns["+i+"],abs==="+abs);
tops[i]=abs;
}
for(int i=0;i<tops.length;i++){
if(tops[i]==min){
index=i;
}
}
Log.i("aaa", "index========================"+index);
return index;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值