Android实现今日头条订阅频道效果
作者:常利兵 发布时间:2021-10-29 23:30:00
标签:Android,今日头条
本文实例为大家分享了Android仿今日头条订阅频道,供大家参考,具体内容如下
源码:Android实现今日头条订阅频道
布局文件
<?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文件和选择器
<?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>
<?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>
自定义布局
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;
}
}
核心代码
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


猜你喜欢
- mybatis plus新增(insert)数据获取主键id在我们执行insert操作的时候,往往会需要拿到新插入数据的主键id做下一步操作
- 本文实例讲述了Android开发实现横向列表GridView横向滚动的方法。分享给大家供大家参考,具体如下:Android 横向列表实现,可
- 本文以实例形式讲述了C#解析JSON的方法,C#封装了对XML和JSON解析的类库,使用相当方便!具体用法如下:1.主要用到的类:主要用到了
- 什么是状态管理状态管理是一个十分广泛的概念,因为状态无处不在。从广义角度讲状态管理就是页面跟代码、跟服务器进行数据同步。例如:你在某购物应用
- Android应用中能很方便的完成这些功能,很多的应用中都有“分享”功能?如何分享呢?下面给大家说说看。最近有人问到Android分享功能用
- C sharp (#) 数据类型获取这里研究一下关于c#中如何获取变量类型的问题。首先我们研究一下如何获取单个变量的类型// 问题一:获取单
- 一、日志的分类1、名字分类log4j :log for java (因为for和4读音差不多,所以交log4j)logBack 日志说明注意
- java 避免出现NullPointerException(空指针)的方法总结Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出
- 目录原理实战原理其原理如图:1.配置数据源信息(包括表名)2.读取数据表字段信息:列名、类型、字段注释、表注释3.编写代码模板,并将该模板加
- 本文是Spring Security系列中的一篇。在上一篇文章中,我们通过实现UserDetailsService和UserDetails接
- 什么是Flyweight模式?享元模式(Flyweight Pattern)是一种软件开发中的设计模式,其主要解决的问题是通过类对象的共享,
- 一、现象在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应。关于该服务的基本功能如下:1、该服务是一个后台刷新指示器
- SpringMVC @RequestBody自动转json Http415错误项目中想用@RequestBody直接接收json串转成对象网
- 目录:DioManager:Dio辅助类NWMethod:请求方法,get、post等NWApi:大家都知道EntityFactory:js
- 对流进行操作时要引用 using System.IO; 命名空间 FileStream常用的属性和方法:属性:CanRead 判断当前流是否
- 本文实例讲述了C#实现将字符串转换成日期格式的方法。分享给大家供大家参考。具体实现方法如下:string s = "2012011
- Java 开发中,需要将一些易变的配置参数放置再 XML 配置文件或者 properties 配置文件中。然而 XML 配置文件需要通过 D
- 快速排序的原理:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一
- 1.包1.包的三大作用区分相同名字的类当类很多时,可方便管理控制访问范围2.包的基本语法package abc.www;3.包的本质实际上就
- 概况本文主要给大家介绍了通过JDK源码学习InputStream的相关内容,JDK 给我们提供了很多实用的输入流 xxxInputStrea