双击实现居中,首先图标响应点击事件,点击的时候在双击过程中响应相应的操作,居中就是y坐标的位置不变,x的坐标位置剧中函数layout(l, t, r, b)中,t和b就是图标y的top和bottom,l就是屏幕的宽度减去图标的宽度,r就是屏幕的宽度加上图标的宽度
具体代码体现如下:
//iv_drag添加点击事件,双击居中
iv_drag.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//arraycopy是一个数组拷贝函数
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
mHits[mHits.length - 1] = SystemClock.uptimeMillis();// 开机后开始计算的时间
if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
//设置图片的位置居中,y的坐标不需要变化,x的坐标居中
iv_drag.layout(winWidth/2 - iv_drag.getWidth()/2, iv_drag.getTop(), winWidth/2 + iv_drag.getWidth()/2, iv_drag.getBottom());
}
}
});
DragViewActivity.java
package com.ldw.safe.Activity;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.ldw.safe.R;
/*
* 修改归属地的显示位置
*/
public class DragViewActivity extends Activity {
private TextView tv_top;
private TextView tv_bottom;
private ImageView iv_drag;
private int startX;
private int startY;
private SharedPreferences mPref;
// 数组长度表示要点击的次数。可以随意设计
long[] mHits = new long[2];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drag_view);
mPref = getSharedPreferences("config", MODE_PRIVATE);
tv_top = (TextView) findViewById(R.id.tv_top);
tv_bottom = (TextView) findViewById(R.id.tv_bottom);
iv_drag = (ImageView) findViewById(R.id.iv_drag);
int lastX = mPref.getInt("lastX", 0);
int lastY = mPref.getInt("lastY", 0);
//获取屏幕的宽度和高度
final int winWidth = getWindowManager().getDefaultDisplay().getWidth();
final int winHeight = getWindowManager().getDefaultDisplay().getHeight();
if(lastY > winHeight/2){
//上边的提示框显示,下边的隐藏
tv_top.setVisibility(View.VISIBLE);
tv_bottom.setVisibility(View.INVISIBLE);
}else{
//上边的提示框隐藏,下边的显示
tv_top.setVisibility(View.INVISIBLE);
tv_bottom.setVisibility(View.VISIBLE);
}
// 获取布局对象,里面包含一系列的参数,比如边距等等
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) iv_drag
.getLayoutParams();
layoutParams.leftMargin = lastX;// 设置左边距
layoutParams.topMargin = lastY;// 设置top边距
// 重新设置位置
iv_drag.setLayoutParams(layoutParams);
//iv_drag添加点击事件,双击居中
iv_drag.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//arraycopy是一个数组拷贝函数
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
mHits[mHits.length - 1] = SystemClock.uptimeMillis();// 开机后开始计算的时间
if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
//设置图片的位置居中,y的坐标不需要变化,x的坐标居中
iv_drag.layout(winWidth/2 - iv_drag.getWidth()/2, iv_drag.getTop(), winWidth/2 + iv_drag.getWidth()/2, iv_drag.getBottom());
}
}
});
// 设置触摸监听
iv_drag.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
//获取起始点在屏幕中的坐标
startX = (int) event.getRawX();
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//获取结束点的坐标
int endX = (int) event.getRawX();
int endY = (int) event.getRawY();
//计算偏移量
int dx = endX - startX;
int dy = endY - startY;
// 更新左上右下距离
int l = iv_drag.getLeft() + dx;
int r = iv_drag.getRight() + dx;
int t = iv_drag.getTop() + dy;
int b = iv_drag.getBottom() + dy;
//边界判断
if( l < 0 || r > winWidth || t < 0 || b > winHeight -20){
break;
}
if(t > winHeight/2){
//上边的提示框显示,下边的隐藏
tv_top.setVisibility(View.VISIBLE);
tv_bottom.setVisibility(View.INVISIBLE);
}else{
//上边的提示框隐藏,下边的显示
tv_top.setVisibility(View.INVISIBLE);
tv_bottom.setVisibility(View.VISIBLE);
}
// 更新界面
iv_drag.layout(l, t, r, b);
// 重新初始化起点坐标
startX = (int) event.getRawX();
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
// 编辑保存记录坐标点
Editor edit = mPref.edit();
edit.putInt("lastX", iv_drag.getLeft());
edit.putInt("lastY", iv_drag.getTop());
edit.commit();
break;
}
//事件往下面传递
return false;
}
});
}
}