android 自定义控件二之仿QQ长按删除

自定义Dialog

1.先上个效果图:

虽然效果丑了点,但主要学习修改已有的控件,例如修改Dialog控件

2.一些基本的只是进行了解

Dialog:

theme是Dialog的样式,常用样式为:

<style name="MyDialogStyle" parent="@android:Theme.Dialog">
            <item name="android:windowFrame">@null</item>
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowBackground"></item>
               <item name="android:windowIsFloating">true</item>
            <item name="android:windowContentOverlay">@null</item>
            <item name="android:backgroundDimEnabled">false</item> </style>    

3.这里在对window,view,activity的关系就个简要的说明

(1)View:最基本的UI组件,表示屏幕上的一个矩形区域。

(2)Window: 表示一个窗口,不一定有屏幕那么大,可以很大也可以很小;
                         它包含一个View tree和窗口的layout 参数。
                         View tree的root View可以通过getDecorView得到。还可以设置Window的Content View。

(3)Activity:Activity包含一个Window,该Window在Activity的attach方法中通过调用
                      PolicyManager.makeNewWindo创建

(4)WindowManager:一个interface,继承自ViewManager。 有一个implementation

   总之,每个窗口对应着一个Window对象,一个根View和一个ViewRoot对象。要想创建一个窗口,可以调用
WindowManager的addView方法,作为参数的view将作为在该窗口上显示的根view

4.要实现上面效果代码如下:

 1)自定义dialog的style,在style.xml文件添加:

1  <style name="MyDialogStyle" parent="@android:Theme.Dialog">
2         <item name="android:windowFrame">@null</item>
3         <item name="android:windowNoTitle">true</item>
4         <item name="android:windowBackground">@android:color/white</item>
5         <item name="android:windowIsFloating">true</item>
6         <item name="android:windowContentOverlay">@null</item>
7         <item name="android:backgroundDimEnabled">false</item>
8     </style>

2)弹出框布局文件

dialogxml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="horizontal" >
 6
 7     <TextView
 8         android:id="@+id/left"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:background="@drawable/left"
12         android:text="待办" />
13
14     <TextView
15         android:id="@+id/right"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:background="@drawable/right"
19         android:text="删除" />
20
21 </LinearLayout>

3)ListView和mainActivity的布局文件就不贴出来了:

ListView的item就是含有一个TextView

mainActivity就含有一个ListView;

4)自定Dialog:

 1 public class MyDialog extends Dialog implements
 2         android.view.View.OnClickListener {
 3
 4     Context context;
 5     IOnClickListener iOnclicklistener;
 6     private TextView left, right;
 7
 8     public MyDialog(Context context, int theme) {
 9         super(context, theme);
10         this.context = context;
11     }
12
13     @Override
14     protected void onCreate(Bundle savedInstanceState) {
15         super.onCreate(savedInstanceState);
16         setContentView(R.layout.dialogxml);
17         left = (TextView) findViewById(R.id.left);
18         left.setOnClickListener(this);
19         right = (TextView) findViewById(R.id.right);
20         right.setOnClickListener(this);
21     }
22
23     // 直接在这里面写的话就必须要将那些参数传进来,增加这个自定义控件的负担
24     @Override
25     public void onClick(View v) {
26         iOnclicklistener = (IOnClickListener) context;
27         switch (v.getId()) {
28         case R.id.left:
29             iOnclicklistener.leftOnClick();
30             break;
31         case R.id.right:
32             iOnclicklistener.rightOnClick();
33             break;
34         default:
35             break;
36         }
37
38     }
39
40     public interface IOnClickListener {
41         public void leftOnClick();
42
43         public void rightOnClick();
44
45     }
46
47 }

上面定义了一个内部接口,这个接口可以时间动态生成作用,在继承该接口的子类中实现该接口的方法后,myDialog调用接口的方法其实就是条用继承类中所实现的方法。

5)mainActivity

  1 public class MainActivity extends Activity implements IOnClickListener {
  2     ListView content;
  3     MyDialog myDialog;
  4     private View currentView;
  5     private int currentPosition;
  6     List<String> listData;
  7     private myAdapter myadapter;
  8
  9     @Override
 10     protected void onCreate(Bundle savedInstanceState) {
 11         super.onCreate(savedInstanceState);
 12         setContentView(R.layout.activity_main);
 13         content = (ListView) findViewById(R.id.listView);
 14         listData = new ArrayList<String>();
 15
 16         for (int i = 0; i < 20; i++) {
 17             listData.add("item" + i);
 18         }
 19         myadapter = new myAdapter(MainActivity.this, listData);
 20         content.setAdapter(myadapter);
 21         content.setOnItemLongClickListener(new ListView.OnItemLongClickListener() {
 22
 23             @Override
 24             public boolean onItemLongClick(AdapterView<?> parent, View view,
 25                     int position, long id) {
 26                 // Toast.makeText(MainActivity.this, "你点击了 第" + position + "个",
 27                 // Toast.LENGTH_SHORT).show();
 28                 // 设置dialog窗口展示的位置
 29                 myDialog = new MyDialog(MainActivity.this,
 30                         R.style.MyDialogStyle);
 31                 int[] location = new int[2];
 32                 currentView = view;
 33                 currentPosition = position;
 34                 currentView.setBackgroundColor(getResources().getColor(
 35                         android.R.color.darker_gray));
 36                 currentView.getLocationOnScreen(location);// x为0,y根据点击位置不同而不同
 37                 DisplayMetrics displayMetrics = new DisplayMetrics();
 38                 Display display = MainActivity.this.getWindowManager()
 39                         .getDefaultDisplay();
 40                 display.getMetrics(displayMetrics);
 41                 // 获取dialog的窗口
 42                 WindowManager.LayoutParams params = myDialog.getWindow()
 43                         .getAttributes();
 44 //                params = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
 45
 46
 47                 params.gravity = Gravity.BOTTOM;
 48                 params.y = display.getHeight() - location[1];
 49                 myDialog.getWindow().setAttributes(params);
 50                 myDialog.setCanceledOnTouchOutside(true);
 51                 myDialog.setOnCancelListener(new MyDialog.OnCancelListener() {
 52
 53                     @Override
 54                     public void onCancel(DialogInterface dialog) {
 55                         currentView.setBackgroundColor(getResources().getColor(
 56                                 android.R.color.white));
 57                     }
 58                 });
 59                 myDialog.show();
 60
 61                 return false;
 62             }
 63
 64         });
 65     }
 66
 67     class viewHolder {
 68         TextView text;
 69     }
 70
 71     class myAdapter extends BaseAdapter {
 72         private Context context;
 73
 74         private List<String> listData;
 75
 76         public myAdapter(Context context1, List<String> listData1) {
 77             this.context = context1;
 78
 79             this.listData = listData1;
 80
 81         }
 82
 83         @Override
 84         public int getCount() {
 85             return listData.size();
 86         }
 87
 88         @Override
 89         public Object getItem(int position) {
 90             return listData.get(position);
 91         }
 92
 93         @Override
 94         public long getItemId(int position) {
 95             return position;
 96         }
 97
 98         @Override
 99         public View getView(int position, View convertView, ViewGroup parent) {
100             viewHolder holder = null;
101             if (convertView == null) {
102                 holder = new viewHolder();
103                 convertView = LayoutInflater.from(context).inflate(
104                         R.layout.list_item, null);
105                 holder.text = (TextView) convertView.findViewById(R.id.text);
106                 convertView.setTag(holder);
107             } else {
108                 holder = (viewHolder) convertView.getTag();
109             }
110             holder.text.setText(listData.get(position));
111             return convertView;
112         }
113     }
114
115     // 完成接口的两个方法
116     @Override
117     public void leftOnClick() {
118         myDialog.dismiss();
119         listData.remove(listData.get(currentPosition));
120         currentView.setBackgroundColor(getResources().getColor(
121                 android.R.color.white));
122         myadapter.notifyDataSetChanged();
123     }
124
125     @Override
126     public void rightOnClick() {
127         // TODO Auto-generated method stub
128         myDialog.dismiss();
129         listData.remove(listData.get(currentPosition));
130         currentView.setBackgroundColor(getResources().getColor(
131                 android.R.color.white));
132         myadapter.notifyDataSetChanged();
133     }
134
135 }

源码

android 自定义控件二之仿QQ长按删除,布布扣,bubuko.com

时间: 2024-10-18 12:54:34

android 自定义控件二之仿QQ长按删除的相关文章

Android高仿QQ消息滑动删除(附源码)

大家都应该使用过QQ吧,他的消息中可以滑动删除功能,我觉得比较有意思,所以模仿写了一个,并且修改了其滑动算法.我先贴几个简单示范图吧 其实主要用的是算法以及对ListView的把控. 一下是适配器的类 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

Android开发学习之路-PopupWindow和仿QQ左滑删除

这周作业,要做一个类似QQ的左滑删除效果的ListView,因为不想给每个item都放一个按钮,所以决定用PopupWindow,这里记录一下 先放一下效果图: 先说明一下这里面的问题: ①没有做到像QQ那样可以允许item跟随手指移动,虽然PopupWindow有update方法让我们动态移动,但是在屏幕外移动会没有动画效果,直接弹进来 ②仔细观察可以发现,item的滑动和删除按钮的滑动是分开的,无法保证它们会一起播放,QQ的动画可以 再说说大概的思路,因为我们没有让item都带上Button

Android自定义View之仿QQ侧滑菜单实现

最近,由于正在做的一个应用中要用到侧滑菜单,所以通过查资料看视频,学习了一下自定义View,实现一个类似于QQ的侧滑菜单,顺便还将其封装为自定义组件,可以实现类似QQ的侧滑菜单和抽屉式侧滑菜单两种菜单. 下面先放上效果图: 我们这里的侧滑菜单主要是利用HorizontalScrollView来实现的,基本的思路是,一个布局中左边是菜单布局,右边是内容布局,默认情况下,菜单布局隐藏,内容布局显示,当我们向右侧滑,就会将菜单拉出来,而将内容布局的一部分隐藏,如下图所示: 下面我们就一步步开始实现一个

android自定义控件(二) 入门,继承View

转载请注明地址:http://blog.csdn.net/ethan_xue/article/details/7313788 ps: 可根据apidemo里LableView,list4,list6学习 文档在dev guide/Framework Topics/User Interface/Building Custom Components 自定义控件的步骤: 1 View的工作原理  2 编写View类  3 为View类增加属性  4 绘制屏幕  5 响应用户消息  6 自定义回调函数

转:仿QQ长按弹出功能菜单

android app普遍常用的弹出上下文菜单是列表式的.QQ列表,在上方弹出冒泡效果菜单,如图 这里讲解一下如何写出这个效果: 图片资源:两张图片,可以拼接成如上效果. 首先,我们需要写布局文件: layout_pop.xml (mipmap是android studio 的引用图片的写法,以前常用@drawable/xxx) <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns

android桌面悬浮窗仿QQ手机管家加速效果

主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗  ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., 返回原位. 1.打开activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andro

android自定义控件系列教程-----仿新版优酷评论剧集卡片滑动控件

我们先来看看优酷的控件是怎么回事? 只响应最后也就是最顶部的卡片的点击事件,如果点击的不是最顶部的卡片那么就先把它放到最顶部,然后在移动到最前面来,反复如次. 知道了这几条那么我们就很好做了. 里面的技术细节可能就是child的放置到前面来的动画问题把. 先看看我们实现得效果: 然后仔细分析一下我们要实现怎么样的效果: 我也是放置了一个按钮和两个view在控件上面,只有当控件在最前面也就是最里面的时候才会响应事件. 然后我们就动手来实现这个控件. 我们继承一个ViewGroup并且命名为Exch

玩转android自定义控件二——自定义索引栏listview

带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个思路. ①首先应当将字母的索引栏继承与一个控件,通过ondraw方法将字母画出来. ②然后我们应该监听这个字母控件的ontouch事件,来判断用户到底是按了那个字母. ③就是实现这个索引栏与listview的联动,就是将listview滑动到按下字母的位置. 大体流程图如下: 有了前面铺垫,我们引出

老猪带你玩转android自定义控件二——自定义索引栏listview

带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个思路. ①首先应当将字母的索引栏继承与一个控件,通过ondraw方法将字母画出来. ②然后我们应该监听这个字母控件的ontouch事件,来判断用户到底是按了那个字母. ③就是实现这个索引栏与listview的联动,就是将listview滑动到按下字母的位置. 大体流程图如下: 有了前面铺垫,我们引出