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

作者:常利兵 时间:2021-10-29 23:30:00 

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

标签:Android,今日头条
0
投稿

猜你喜欢

  • 有关tomcat内存溢出的完美解决方法

    2023-09-18 09:02:25
  • 关于SpringBoot使用Redis空指针的问题(不能成功注入的问题)

    2023-09-04 01:30:03
  • springboot vue测试平台开发调通前后端环境实现登录

    2021-08-13 03:54:02
  • springboot如何配置定时任务

    2021-06-22 09:16:12
  • SpringBoot项目集成Swagger和swagger-bootstrap-ui及常用注解解读

    2023-03-17 06:30:20
  • Java源码解析HashMap成员变量

    2023-04-24 07:20:22
  • Docker搭建前端Java的开发环境详解

    2023-05-21 04:23:25
  • Android实现腾讯新闻的新闻类别导航效果

    2023-07-29 04:17:46
  • java如何对map进行排序详解(map集合的使用)

    2022-12-22 18:26:13
  • 为什么Spring和IDEA都不推荐使用 @Autowired 注解

    2023-12-08 17:54:44
  • Unity实战之FlyPin(见缝插针)小游戏的实现

    2022-05-21 19:46:31
  • Java实现经典游戏飞机大战-I的示例代码

    2023-07-30 15:45:22
  • SSM框架搭建图文教程(推荐)

    2023-11-10 20:39:07
  • springboot自定义过滤器的方法

    2021-07-29 05:36:53
  • spring boot中配置hikari连接池属性方式

    2022-11-13 06:06:44
  • android使用flutter的ListView实现滚动列表的示例代码

    2023-06-26 09:00:13
  • C#异步编程Task的创建方式

    2023-07-23 06:22:43
  • 为什么阿里巴巴要求日期格式化时必须有使用y表示年

    2023-11-02 20:08:58
  • 普通对象使用spring容器中的对象的实现方法

    2023-06-17 12:27:20
  • Linux下执行java程序的方法

    2023-01-25 07:22:23
  • asp之家 软件编程 m.aspxhome.com