本文实例为大家分享了Android仿今日头条订阅频道,供大家参考,具体内容如下
源码:Android实现今日头条订阅频道
布局文件
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
|
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools" android:id = "@+id/activity_main" android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" tools:context = "com.example.a2_.MainActivity" > < TextView android:background = "@android:color/holo_blue_dark" android:gravity = "center_horizontal" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:text = "已订阅频道" /> < com.example.a2_.MyGridLayout android:id = "@+id/gl1" android:columnCount = "4" android:layout_gravity = "center_horizontal" android:layout_width = "wrap_content" android:layout_height = "wrap_content" > </ com.example.a2_.MyGridLayout > < TextView android:gravity = "center_horizontal" android:background = "@android:color/darker_gray" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:text = "未订阅频道" /> < com.example.a2_.MyGridLayout android:columnCount = "4" android:id = "@+id/gl2" android:layout_gravity = "center_horizontal" android:layout_width = "wrap_content" android:layout_height = "wrap_content" > </ com.example.a2_.MyGridLayout > </ LinearLayout > |
shape文件和选择器
1
2
3
4
5
6
|
<? xml version = "1.0" encoding = "utf-8" ?> < shape xmlns:android = "http://schemas.android.com/apk/res/android" > < corners android:radius = "5dp" /> < stroke android:color = "#000" android:width = "1dp" /> </ shape > |
1
2
3
4
5
6
7
8
|
<? xml version = "1.0" encoding = "utf-8" ?> < shape xmlns:android = "http://schemas.android.com/apk/res/android" > < corners android:radius = "5dp" /> < stroke android:color = "#ff0000" android:dashGap = "1dp" android:dashWidth = "3dp" android:width = "1dp" /> </ shape > |
自定义布局
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
package com.example.a2_; import android.animation.LayoutTransition; import android.content.Context; import android.graphics.Color; import android.graphics.Rect; import android.util.AttributeSet; import android.view.DragEvent; import android.view.View; import android.widget.GridLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2017.06.08.0008. */ public class MyGridLayout extends GridLayout implements View.OnDragListener { private OnItemClickListener listener; private List<Rect> rects; private View DragItem = null ; private boolean dragable; public MyGridLayout(Context context, AttributeSet attrs) { super (context, attrs); //添加动画 setLayoutTransition( new LayoutTransition()); //舰艇拖拽事件 setOnDragListener( this ); } //根据传递进来的数据,动态地添加控件 public void setData(List<String> list) { for ( int i = 0 ; i < list.size(); i++) { addItem(list.get(i)); } } public void addItem(String s) { final TextView textView = new TextView(getContext()); textView.setText(s); textView.setTextColor(Color.BLACK); textView.setPadding( 15 , 5 , 15 , 5 ); //设置背景 textView.setBackgroundResource(R.drawable.selector_item_bg); textView.setTextSize( 25 ); //将控件添加到页面中 addView(textView); LayoutParams layoutParams = (LayoutParams) textView.getLayoutParams(); //设置外边距 layoutParams.setMargins( 5 , 5 , 5 , 5 ); //监听textview点击事件 textView.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { if (listener != null ) { listener.onItemClick(v); } } }); //监听控件的长按事件 textView.setOnLongClickListener( new OnLongClickListener() { @Override public boolean onLongClick(View v) { if (!dragable) { return true ; } //把当前长按的控件变红,并且有虚线 v.setBackgroundResource(R.drawable.selector_item_red_bg); //开始拖拽控件 v.startDrag( null , new DragShadowBuilder(v), null , 0 ); DragItem = v; //获取所有空间的矩形区域 getAllRect(); return true ; } }); } //获取所有的矩形区域 private void getAllRect() { rects = new ArrayList<>(); for ( int i = 0 ; i < getChildCount(); i++) { View view = getChildAt(i); //获取每个控件的坐标点,并存在集合中 rects.add( new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom())); } } public void setOnClickListener(OnItemClickListener listener) { this .listener = listener; } @Override public boolean onDrag(View v, DragEvent event) { if (!dragable) { return true ; } switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: System.out.println( "ACTION_DRAG_STARTED" ); break ; case DragEvent.ACTION_DRAG_ENTERED: System.out.println( "ACTION_DRAG_ENTERED" ); break ; case DragEvent.ACTION_DRAG_EXITED: System.out.println( "ACTION_DRAG_EXITED" ); break ; case DragEvent.ACTION_DRAG_LOCATION: System.out.println( "ACTION_DRAG_LOCATION" ); //拖拽移动时,位置发生变化 //根据当前的位置,判断应该插入到哪个位置 int dragItemIndex = findDragItem(event); if (dragItemIndex != - 1 && DragItem != null && getChildAt(dragItemIndex) != DragItem) { //先删除原来的控件 removeView(DragItem); //吧新的控件拖拽到新的位置 addView(DragItem, dragItemIndex); } break ; case DragEvent.ACTION_DROP: System.out.println( "ACTION_DROP" ); break ; case DragEvent.ACTION_DRAG_ENDED: System.out.println( "ACTION_DRAG_ENDED" ); if (DragItem != null ) { DragItem.setBackgroundResource(R.drawable.selector_item_bg); } break ; } return true ; } private int findDragItem(DragEvent event) { if (rects == null ) { return - 1 ; } for ( int i = 0 ; i < rects.size(); i++) { //如果鼠标当前的坐标包含在某个控件的坐标内部,那就说明,当前在该空间内部 if (rects.get(i).contains(( int ) event.getX(), ( int ) event.getY())) { return i; } } return - 1 ; } public interface OnItemClickListener { void onItemClick(View v); } // 设置控件是否可以拖拽 public void setDragable( boolean dragable) { this .dragable = dragable; } } |
核心代码
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
package com.example.a2_; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import java.util.Arrays; import java.util.List; import butterknife.ButterKnife; import butterknife.InjectView; public class MainActivity extends Activity { @InjectView (R.id.gl1) MyGridLayout gl1; @InjectView (R.id.gl2) MyGridLayout gl2; @InjectView (R.id.activity_main) LinearLayout activityMain; //创建已订阅和为订阅的集合 private List<String> select = Arrays.asList( "北京" , "中国" , "国际" , "体育" , "生活" , "旅游" , "科技" , "军事" , "时尚" , "财经" , "育儿" , "汽车" ); private List<String> unselect = Arrays.asList( "娱乐" , "服饰" , "音乐" , "视频" , "段子" , "搞笑" , "科学" , "房产" , "名站" ); @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject( this ); //初始化数据 initData(); } private void initData() { gl1.setData(select); gl2.setData(unselect); gl1.setDragable( true ); //设置监听 gl1.setOnClickListener( new MyGridLayout.OnItemClickListener() { @Override public void onItemClick(View v) { gl1.removeView(v); //设置中间人 String s = ((TextView) v).getText().toString(); gl2.addItem(s); } }); gl2.setOnClickListener( new MyGridLayout.OnItemClickListener() { @Override public void onItemClick(View v) { gl2.removeView(v); //设置中间人 String s = ((TextView) v).getText().toString(); gl1.addItem(s); } }); } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_32890771/article/details/72935087