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);
    }
  });
}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android仿今日头条顶部导航栏效果的实例代码

    随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候像今日头条新闻客户端要显示的内容太多,而且又想在主界面全部显示出来,所以有加了顶部导航栏. 今日头条顶部导航栏区域的主要部分是一个导航菜单.导航菜单是一组标签的集合,在新闻客户端中,每个标签标示一个新闻类别,对应下面ViewPager控件的一个分页面.当用户在ViewPager区域滑动页面时,对应的导航菜单标签也会相应的被选中,选中的标签通过一个矩形红框高亮显示,红框背

  • Android仿今日头条滑动页面导航效果

    最近项目中用到了滑动页面,也就是和目前市场上很火的"今日头条"页面滑动类似,在网上找了一下,大部分都是用ViewPager来实现的,刚开始我用的是ViewPager+ViewGroup,上面的标题按钮用的是HorizontalScrollView,写完之后感觉效果比较生硬,果断换掉,发现了一个效果比较好的第三方,也就是今天的主题:PagerSlidingTabStrip.好了,下面来具体介绍一下PagerSlidingTabStrip,进行一下源码解析. 一.看一下demo的样子吧 二

  • Android使用RecyclerView实现今日头条频道管理功能

    使用过今日头条的伙计们对这个效果肯定很熟悉.拖拽可排序,点击标签后可以删除.今天我们采用RecyclerView来实现. 实现思路: 通过ItemTouchHelper来绑定RecyclerView的子控件触摸事件. 当滑动拖拽的时候,通知适配器来交换两个子控件的显示位置. 更改数据源,使数据源与子空间显示内容一致. 这就是实现的基本思路,是不是很简单?当然,首先要了解一下ItemTouchHelper这哥们儿是干啥的,有什么作用. This is a utility class to add

  • Android应用中仿今日头条App制作ViewPager指示器

    一.概述 顶部ViewPager指示器的字体变色,该效果图是这样的: 大概是今天头条的app,神奇的地方就在于,切换ViewPager页面的时候,顶部指示器改成了字体颜色的变化,个人觉得还是不错的. 那么核心的地方就是做一个支持字体这样逐渐染色就可以了,我大概想了32s,扫描了一些可能实现的方案,最终定位了一个靠谱的,下面我就带大家开始实现的征程. 实现之前贴一下我们的效果图: 1.简单使用 效果如上图了,关于颜失色的改变我添加了两个方向,一个是左方向,一个是有方向. 单纯的使用,可能觉得没什么

  • Android 仿今日头条简单的刷新效果实例代码

    点击按钮,先自动进行下拉刷新,也可以手动刷新,刷新完后,最后就多一行数据.有四个选项卡. 前两天导师要求做一个给本科学生预定机房座位的app,出发点来自这里.做着做着遇到很多问题,都解决了.这个效果感觉还不错,整理一下. MainActivity package com.example.fragmentmytest; import android.content.DialogInterface; import android.graphics.Color; import android.os.B

  • Android 仿今日头条评论时键盘自动弹出的效果(推荐)

    Android 仿今日头条评论时键盘自动弹出的效果:当点击评论时,弹出对话框,同时弹出软键盘,当点击返回键时,将对话框关闭,不只是关闭软键盘. 效果图: 对这个对话框设置一个style效果: <style name="inputDialog" parent="@android:style/Theme.Holo.Light.Dialog"> <item name="android:windowBackground">@col

  • android自定义view仿今日头条加载文字变色效果

    本文实例为大家分享了android自定义view加载文字变色效果的具体代码,供大家参考,具体内容如下 不分析了,很简单,直接贴代码: package com.loading; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import

  • Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

    我这里只是简单的用了两个listview来实现的,先上效果图.比较粗糙.预留了自定义的空间. 思路: 从上图应该可以看的出来.就是上下两个listview.点击下面的ltem.会动态的移动到上一个listview的最后.上面的listview 为listview1,下面的为listview2. 点击listview2,获取到view ,设置一个动画,移动到listview1 ,listview2中删除被点的item.listview1中新增一个. 上代码: Mainactivity.java 部

  • Android仿今日头条APP实现下拉导航选择菜单效果

    本文实例为大家分享了在Android中如何实现下拉导航选择菜单效果的全过程,供大家参考,具体内容如下 关于下拉导航选择菜单效果在新闻客户端中用的比较多,当然也可以用在其他的项目中,这样可以很方便的选择更多的菜单.我们可以让我们的应用顶部有左右滑动或进行切换的导航菜单,也可以为了增强用户体验在应用中添加这样的下拉导航选择菜单效果. 关于它的实现原理,其实也是挺简单的,就是使用PopupWindow来进行展现,在显示时控制其高度并配置以相应的动画效果.在PopupWindow中我使用GridView

  • Android仿今日头条多个fragment懒加载的实现

    前言 最近有时间,所以我又双叒叕推新一篇文章了,fragment懒加载实现虽然是个小模块,但做过的人都有体会,通常并不会轻易就成功了的,让你辗转反侧,彻夜难眠,绵绵无绝期.我就按照今日头条的样式做了一个懒加载功能.文章到一半会解释大家可能遇到的不加载数据了的坑,先不剧透. Fragment的生命周期回顾 github代码直通车 (本地下载) 这里是今日头条效果: 自制效果,有图有真相: 实现思路: 使用Fragment类自带方法setUserVisibleHint()判断当前fragment是否

随机推荐