服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android实现今日头条订阅频道效果

Android实现今日头条订阅频道效果

2022-09-21 15:07常利兵 Android

这篇文章主要为大家详细介绍了Android实现今日头条订阅频道效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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

延伸 · 阅读

精彩推荐