• 初中生专区
  • 高中生专区
  • 大学生专区
  • 待业在职专区
  • 专业咨询
  • 学费咨询
  • 就业咨询
  • 加入收藏|常见问题|网站地图
  • 首页
  • 学校介绍
  • 学校新闻
  • 专业课程
  • 师资力量
  • 就业保障
  • 明星学员
  • 招生问答
  • 在线课堂
  • 在线报名
  • 单招测试
  • 高中生学历教育
  • 【在线咨询】
  • 职业技术培训
  • 【在线咨询】
  • 学习方案规划
  • 【在线咨询】
学校
学校简介
学校特色
学校环境
学校文化
师资力量
来校路线
课程
软件开发课程
提前单招
学士后Java
学士后.NET
就业
就业流程
就业明星
职前培训
招聘信息
咨询
招生问答
在线测试
在线留言
在线报名
学校 课程 就业 咨询 新闻
网站公告
  • 祝贺 蒋会红 成功报读桂林北大青鸟T21班”ACCP软件开发”专业!
  • 祝贺 陈国荣 成功报读桂林北大青鸟T21班”ACCP软件开发”专业!
  • 祝贺 李昌琦 成功报读桂林北大青鸟T21班”ACCP软件开发”专业!
  • 祝贺 毛燕 成功报读桂林北大青鸟T21班”ACCP软件开发”专业!
  • 祝贺 李军灵 成功报读桂林北大青鸟T21班”ACCP软件开发”专业!
  • 祝贺 吴迪 成功报读桂林北大青鸟T21班”ACCP软件开发”专业!
  • 桂林北大青鸟冬季特惠——“先就业、后付款”活动,全面解决学费问题,让学生后顾无忧!
  • “学技术、拿高薪”!桂林北大青鸟互联网精英就业班火热招生中!仅剩10个名额啦!
新闻导航
  • 学校新闻
  • 就业新闻
  • 高考新闻
  • 开班信息
  • 专业设置
  • 媒体报道
  • 招聘信息
  • 体验课
  • 转业、退伍军人新闻
  • 技术园地
  • SEO
    PHP
    .Net
    Android
    Java
 职业技能培训开班信息
专业课程状态
高考自主招生热招中
初中生2+3连读热招中
2017就业示范班热招中
大学生就业实训班热招中
2017定向委培班热招中
办公软件短期班热招中
本月热点
校区位置
当前位置:北大青鸟桂林志成中心 → 新闻中心 → Android → 新闻正文
基于Android图标拖动布局的实现
作者:桂林北大青鸟 | 来源:网络转摘 | 【大 中 小】

界面需求:

界面整齐的排列各个图标,长按其中一个,可拖动选中的图标。拖动到想要的位置之后,界面可将图标再次排列整齐。类似一般android手机桌面布局。

控件介绍:

Android为我们提供了GridView 网格视图。GridView 可在控件内添加view子控件,实现view的整齐排列,但是GridView并没有给我们提供拖拽view的功能,因此需要重新编写GridView来实现需要的功能。

public class DragGrid extends GridView{}

如上述代码,重新定义一个DragGrid控件,继承于GridView。

Android事件处理:

事件是我们在与UI交互式发生的,我们点击一个按键时,可能就已经出发好几个事件,例如我们点击数字键“0”,他会涉及到按下事件,和一个弹起(松开)事件,在我们android中还可能涉及到触摸屏事件,所以在android系统中,事件是作为常用的功能之一。而这里我用到的主要有两个:

1 长按LongClick;

2 触碰事件TouchEvent;

适配器Adapter:

适配器(Adapter)是一种界面对象,他用于列表组件和数据来源之间的桥梁。在这里我们用于GridView的数据填充,以及拖动后的布局改变。Android本身提供给我们的配置器不满足我们的需求因此也需要重写一个新的Adapter;

public class DateAdapter extends BaseAdapter {}

主要思路:

触发GridView的子控件的长按监听,需要重写GridView的LongClick的监听。之后进入图标拖拽功能,此功能需要重写触碰事件TouchEvent。但是仅仅如此,会带来一个问题,在没有长按的时候也会触发触碰事件TouchEvent。因此我们需要一个机制来判断LongClick和TouchEvent的先后顺序,在LongClick触发之后才执行TouchEvent。好在android为我们提供了另一个事件——onInterceptTouchEvent。onInterceptTouchEvent是用于拦截手势事件的,每个手势事件都会先调用onInterceptTouchEvent。重写GridView的onInterceptTouchEvent使得在手指触碰屏幕的时候调用LongClick而不是TouchEvent,就可以避免两者之间的矛盾。之后使用Adapter对GridView的内容进行填充,即可完成布局。

具体实现与代码:

具体实现还需要还需要具体的页面布局。布局文件分为两个,一个是主界面,之间调用重写的GridView即可。另一个是GridView的item,我们可以用一个ImageView来显示图标,下面用一个TextView来注释名称。

而将item填充到GridView里就是Adapter的工作了。

获取item:

public View getView(int position, View convertView, ViewGroup parent) {

convertView = LayoutInflater.from(context).inflate(R.layout.item, null);

txtAge = (TextView) convertView.findViewById(R.id.txt_userAge);

txtAge.setText(lstDate.get(position));

return convertView;

}

}

将item填充到GridView中:

final DateAdapter adapter = new DateAdapter(MainActivity.this, l1);

gridView.setAdapter(adapter);

重写onInterceptTouchEvent:

public boolean onInterceptTouchEvent(MotionEvent ev) {

if (ev.getAction() == MotionEvent.ACTION_DOWN) {

return setOnItemLongClickListener(ev);

}

return super.onInterceptTouchEvent(ev);

}

ACTION_DOWN代表手指放下,此时返回setOnItemLongClickListener(ev)即可先执行长按监听。

重写TouchEvent:

public boolean onTouchEvent(MotionEvent ev) {

if (dragImageView != null

&& dragPosition != AdapterView.INVALID_POSITION) {

int x = (int) ev.getX();

int y = (int) ev.getY();

switch (ev.getAction()) {

case MotionEvent.ACTION_MOVE:

if(!isCountXY) {

xtox = x-mLastX;

ytoy = y-mLastY;

isCountXY= true;

}

onDrag(x, y);

if(!isMoving )

OnMove(x,y);

break;

case MotionEvent.ACTION_UP:

stopDrag();

onDrop(x, y);

break;

}

}

return super.onTouchEvent(ev);

}

重写LongClick事件:

public boolean setOnItemLongClickListener(final MotionEvent ev) {

this.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

@Override

public boolean onItemLongClick(AdapterView arg0, View arg1,

int arg2, long arg3) {

int x = (int) ev.getX();

int y = (int) ev.getY();

Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache(true));

Bitmap bitmap = Bitmap.createBitmap(bm, 8, 8, bm.getWidth()-8, bm.getHeight()-8);

startDrag(bitmap, x, y);

hideDropItem();

itemView.setVisibility(View.INVISIBLE);

isMoving = false;

return false;

};

});

return super.onInterceptTouchEvent(ev);

}

由于相关代码过于复杂,在此只做简单思路描述:x,y分别代表拖动item的初始坐标。ACTION_MOVE代表手指在屏幕上滑动。长按事件执行时,获取长按item的位置,和截图,隐藏原先Item。事实上用户拖动的是item的截图,item本身是无法拖动的,但这不影响用户体验。之后执行onTouchEvent,当“item”移动到新的位置是,使用动画效果使原先在此位置的item被挤到空位,当然这里的item移动也是一个障眼法。而当手指松开的时候再利用Adapter重新排列item位置。解除原先item的隐藏。至此,android图标拖动布局的实现。

顶一下
TAGS:安卓 android
上篇新闻:不容错过!开发者必备的十二大Android开发资源
下篇新闻:浅析android应用增量升级
高考与报名入口
课程推荐
  • 软件开发应用课程
  • 高中生学历教育
  • 网络营销课程
  • 学士后java培训课程
相关新闻
  • Android Logcat用法
  • 浅析android应用增量升级
  • 基于Android图标拖动布局的实现
  • 不容错过!开发者必备的十二大Android开发资
  • Android 异步加载网络图片并缓存到本地
推荐阅读
  • 桂林市极创电子科技有限公司Java程序招聘信
  • 桂林北大青鸟“高中生特招班”!十万年薪,你
  • 盘点2014年最热门的行业,高中生选择专业需睁
  • CCTV2经济半小时专题报道,北大青鸟关注就业
  • 高考新政:奥赛等加分缩水 加大见义勇为分
合作伙伴
友情链接
    • 北大青鸟总部
    • 桂林山水职业学院
    • 广州北大青鸟
    • 合肥北大青鸟
    • 考研
    • 中小学课外辅导
    • 昆明家教
    • 丽江公务员考试网
    • 易考吧培训
    • 人大留学预科班
    • ios培训
    • 江苏财经网
    • 郑州室内设计培训
    • 珠海北大青鸟
    • 武汉北大青鸟
    • JOBG游戏招聘
    • 北京北大青鸟
    • 桂林软件学院
    • 宁波培训
    • 深圳舞蹈学校
    • 北大青鸟学校
    • 桂林分类信息
    • 北京北大青鸟培训学校怎样
    • 桂林猎聘网
关于我们| 媒体报道| 青鸟荣誉| 大事记| 技术园地| 新闻中心| 在线报名| 在线咨询| 来校路线| 加入我们
    • 免费电话:400-078-8286
    • 客服热线:0773-2820777
    • 咨询时间:周一至周日 8:30-17:30
    • 传真:0773-2824777
    • 邮箱:gl.jb-aptech@qq.com
    • 投诉:0773-2820777
    • 校区地址:广西区桂林市秀峰区八桂大厦八层
    • 公交路线:乘坐10路、99路、100路公交车至十字街站
    • 邮政编码:541001
Copyright © 2008 - 2017 桂林志成信息技术有限责任公司  版权所有  桂ICP备17012984号