package com.zqy.mygridview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.os.Vibrator;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import com.zqy.myfloatview.R;
public class DragGrid extends GridView {
/** 点击时候的X位置 */
public int downX;
/** 点击时候的Y位置 */
public int downY;
/** 点击时候对应整个界面的X位置 */
public int windowX;
/** 点击时候对应整个界面的Y位置 */
public int windowY;
/** 屏幕上的X */
private int win_view_x;
/** 屏幕上的Y*/
private int win_view_y;
/** 拖动的里x的距离 */
int dragOffsetX;
/** 拖动的里Y的距离 */
int dragOffsetY;
/** 长按时候对应postion */
public int dragPosition;
/** Up后对应的ITEM的Position */
private int dropPosition;
/** 开始拖动的ITEM的Position*/
private int startPosition;
/** item高 */
private int itemHeight;
/** item宽 */
private int itemWidth;
/** 拖动的时候对应ITEM的VIEW */
private View dragImageView = null;
/** 长按的时候ITEM的VIEW*/
private ViewGroup dragItemView = null;
/** WindowManager管理器 */
private WindowManager windowManager = null;
/** */
private WindowManager.LayoutParams windowParams = null;
/** item总量*/
private int itemTotalCount;
/** 一行的ITEM数量*/
private int nColumns = 4;
/** 行数 */
private int nRows;
/** 剩余部分 */
private int Remainder;
/** 是否在移动 */
private boolean isMoving = false;
/** */
private int holdPosition;
/** 拖动的时候放大的倍数 */
private double dragScale = 1.2D;
/** 震动器 */
private Vibrator mVibrator;
/** 每个ITEM之间的水平间距 */
private int mHorizontalSpacing = 15;
/** 每个ITEM之间的竖直间距 */
private int mVerticalSpacing = 15;
/* 移动时候最后个动画的ID */
private String LastAnimationID;
private OnMyItemLongClickListener onMyItemLongClickListener;
public OnMyItemLongClickListener getOnMyItemLongClickListener() {
return onMyItemLongClickListener;
}
public void setOnMyItemLongClickListener(OnMyItemLongClickListener onMyItemLongClickListener) {
this.onMyItemLongClickListener = onMyItemLongClickListener;
}
interface OnMyItemLongClickListener {
void OnItemLongClick(AdapterView<?> parent, View view,
int position, long id);
}
public DragGrid(Context context) {
super(context);
init(context);
}
public DragGrid(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public DragGrid(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public void init(Context context){
mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
//将布局文件中设置的间距dip转为px
mHorizontalSpacing = DataTools.dip2px(context, mHorizontalSpacing);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
downX = (int) ev.getX();
downY = (int) ev.getY();
windowX = (int) ev.getX();
windowY = (int) ev.getY();
setOnItemClickListener(ev);
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
boolean bool = true;
if (dragImageView != null && dragPosition != AdapterView.INVALID_POSITION) {
// 移动时候的对应x,y位置
bool = super.onTouchEvent(ev);
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) ev.getX();
windowX = (int) ev.getX();
downY = (int) ev.getY();
windowY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
onDrag(x, y ,(int) ev.getRawX() , (int) ev.getRawY());
if (!isMoving){
OnMove(x, y);
}
if (pointToPosition(x, y) != AdapterView.INVALID_POSITION){
break;
}
break;
case MotionEvent.ACTION_UP:
stopDrag();
onDrop(x, y);
requestDisallowInterceptTouchEvent(false);
break;
default:
break;
}
}
return super.onTouchEvent(ev);
}
/** 在拖动的情况 */
private void onDrag(int x, int y , int rawx , int rawy) {
if (dragImageView != null) {
windowParams.alpha = 0.6f;
// windowParams.x = rawx - itemWidth / 2;
// windowParams.y = rawy - itemHeight / 2;
windowParams.x = rawx - win_view_x;
windowParams.y = rawy - win_view_y;
windowManager.updateViewLayout(dragImageView, windowParams);
}
}
/** 在松手下放的情况 */
private void onDrop(int x, int y) {
// 根据拖动到的x,y坐标获取拖动位置下方的ITEM对应的POSTION
int tempPostion = pointToPosition(x, y);
// if (tempPostion != AdapterView.INVALID_POSITION) {
dropPosition = tempPostion;
DragAdapter mDragAdapter = (DragAdapter) getAdapter();
//显示刚拖动的ITEM
mDragAdapter.setShowDropItem(true);
//刷新适配器,让对应的ITEM显示
mDragAdapter.notifyDataSetChanged();
// }
}
/**
* 长按点击监听
* @param ev
*/
public void setOnItemClickListener(final MotionEvent ev) {
setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
if(null!=onMyItemLongClickListener){
onMyItemLongClickListener.OnItemLongClick(parent,view,position,id);
}
int x = (int) ev.getX();// 长安事件的X位置
int y = (int) ev.getY();// 长安事件的y位置
startPosition = position;// 第一次点击的postion
dragPosition = position;
if (startPosition <= 0) {//第0个位置不能移动
return false;
}
ViewGroup dragViewGroup = (ViewGroup) getChildAt(dragPosition - getFirstVisiblePosition());
TextView dragTextView = (TextView)dragViewGroup.findViewById(R.id.text_item);
dragTextView.setSelected(true);
dragTextView.setEnabled(false);
itemHeight = dragViewGroup.getHeight();
itemWidth = dragViewGroup.getWidth();
itemTotalCount = DragGrid.this.getCount();
int row = itemTotalCount / nColumns;// 算出行数
Remainder = (itemTotalCount % nColumns);// 算出最后一行多余的数量
if (Remainder != 0) {
nRows = row + 1;
} else {
nRows = row;
}
// 如果特殊的这个不等于拖动的那个,并且不等于-1
if (dragPosition != AdapterView.INVALID_POSITION) {
// 释放的资源使用的绘图缓存。如果你调用buildDrawingCache()手动没有调用setDrawingCacheEnabled(真正的),你应该清理缓存使用这种方法。
win_view_x = windowX - dragViewGroup.getLeft();//VIEW相对自己的X,半斤
win_view_y = windowY - dragViewGroup.getTop();//VIEW相对自己的y,半斤
dragOffsetX = (int) (ev.getRawX() - x);//手指在屏幕的上X位置-手指在控件中的位置就是距离最左边的距离
dragOffsetY = (int) (ev.getRawY() - y);//手指在屏幕的上y位置-手指在控件中的位置就是距离最上边的距离
dragItemView = dragViewGroup;
dragViewGroup.destroyDrawingCache();
dragViewGroup.setDrawingCacheEnabled(true);
Bitmap dragBitmap = Bit
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
android tablayout重新排序以及拖动选择标签 (131个子文件)
app-release.apk 1.89MB
gradlew.bat 2KB
fileSnapshots.bin 2.77MB
classAnalysis.bin 1.13MB
taskHistory.bin 855KB
jarAnalysis.bin 409KB
fileHashes.bin 391KB
taskHistory.bin 80KB
taskJars.bin 28KB
resourceHashesCache.bin 20KB
last-build.bin 1B
built.bin 0B
.gitignore 127B
.gitignore 8B
build.gradle 1008B
build.gradle 573B
settings.gradle 16B
gradlew 5KB
app.iml 13KB
MyFloatView.iml 865B
gradle-wrapper.jar 52KB
DragGrid.java 14KB
DragRelativeLayout.java 14KB
ChannelManage.java 6KB
ChannelDao.java 5KB
DensityUtil.java 5KB
MyGridviewActivity.java 4KB
DragAdapter.java 4KB
TabLayoutActivity.java 3KB
MyLayout.java 2KB
MainActivity.java 2KB
FragmentAdapter.java 2KB
ChannelItem.java 1KB
SQLHelper.java 1KB
AppApplication.java 871B
ExampleInstrumentedTest.java 765B
ChannelDaoInface.java 724B
FragmentOne.java 603B
DataTools.java 521B
ExampleUnitTest.java 413B
output.json 191B
taskHistory.lock 17B
javaCompile.lock 17B
fileContent.lock 17B
fileHashes.lock 17B
cache.properties.lock 2B
ic_launcher_round.png 15KB
ic_launcher_round.png 10KB
ic_launcher.png 9KB
ic_launcher_round.png 7KB
ic_launcher.png 6KB
ic_launcher_round.png 5KB
ic_launcher.png 4KB
ic_launcher.png 3KB
ic_launcher_round.png 3KB
ic_launcher.png 2KB
channel_new.png 796B
proguard-rules.pro 772B
gradle.properties 747B
local.properties 480B
gradle-wrapper.properties 236B
cache.properties 51B
workspace.xml 205KB
ic_launcher_background.xml 6KB
misc.xml 2KB
subscribe_item_bg.xml 2KB
ic_launcher_foreground.xml 2KB
colors.xml 2KB
activity_my_gridview.xml 2KB
activity_main.xml 2KB
activity_tab_layout.xml 2KB
AndroidManifest.xml 1KB
subscribe_category_item.xml 1KB
com_android_support_test_espresso_espresso_idling_resource_3_0_2.xml 765B
com_android_support_test_espresso_espresso_core_3_0_2.xml 710B
android_arch_lifecycle_livedata_core_1_1_1.xml 687B
android_arch_lifecycle_viewmodel_1_1_1.xml 668B
com_android_support_test_monitor_1_0_2.xml 662B
android_arch_lifecycle_runtime_1_1_1.xml 658B
com_android_support_test_runner_1_0_2.xml 657B
android_arch_core_runtime_1_1_1.xml 647B
gradle.xml 626B
org_hamcrest_hamcrest_integration_1_3_jar.xml 578B
runConfigurations.xml 564B
org_hamcrest_hamcrest_library_1_3_jar.xml 557B
android_arch_lifecycle_common_1_1_1_jar.xml 548B
org_hamcrest_hamcrest_core_1_3_jar.xml 543B
com_squareup_javawriter_2_1_1_jar.xml 538B
com_android_support_animated_vector_drawable_28_0_0_beta01.xml 535B
android_arch_core_common_1_1_1_jar.xml 533B
com_android_support_support_vector_drawable_28_0_0_beta01.xml 532B
javax_inject_javax_inject_1_jar.xml 528B
com_android_support_localbroadcastmanager_28_0_0_beta01.xml 526B
com_android_support_versionedparcelable_28_0_0_beta01.xml 520B
com_android_support_asynclayoutinflater_28_0_0_beta01.xml 520B
com_android_support_swiperefreshlayout_28_0_0_beta01.xml 517B
com_android_support_support_core_utils_28_0_0_beta01.xml 517B
com_android_support_coordinatorlayout_28_0_0_beta01.xml 514B
com_android_support_slidingpanelayout_28_0_0_beta01.xml 514B
com_android_support_support_fragment_28_0_0_beta01.xml 511B
共 131 条
- 1
- 2
资源评论
qiuyin2015
- 粉丝: 20
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功