Android实现今日头条订阅频道效果
16lz
2021-12-04
本文实例为大家分享了Android仿今日头条订阅频道,供大家参考,具体内容如下
源码:Android实现今日头条订阅频道
布局文件
<?xml version="1.0" encoding="utf-8"?>
shape文件和选择器
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
自定义布局
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 Listrects;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 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;}@Overridepublic 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 Listselect = Arrays.asList("北京", "中国", "国际", "体育", "生活", "旅游", "科技", "军事", "时尚", "财经", "育儿", "汽车");private List unselect = Arrays.asList("娱乐", "服饰", "音乐", "视频", "段子", "搞笑", "科学", "房产", "名站");@Overrideprotected 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); } });}}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
更多相关文章
- android 边框圆角
- android中任何禁止软键盘自动弹出而点击EditText的时候才弹出
- Android-Layout布局
- Android(安卓)library projects cannot be launched
- Android(安卓)P系统设置之默认选择网络类型(4G,3G,2G)
- android webview css z-index属性无效
- 设置环境变量
- 2010.11.16———android Camera 拍照的两个问题
- android中自定义控件