Android仿新闻顶部导航标签切换效果

最近由于个人兴趣原因,写了个模仿新闻顶部导航标签的demo。具体看下图。

那么大致上我们会用到这些知识。

1.Fragment
2.FragmentPagerAdapter
3.HorizontalScrollView
4.PopupWindow

ok,那么首先进入第一步。

为了实现顶部的标签,我们要用到HorizontalScrollView,因为原有的HorizontalScrollView控件已经不能满足我们的使用了。所以这里就自定义一个HorizontalScrollView

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.ImageView; 

/**
 * 自定义垂直滑动View
 *
 */ 

public class ColumnHorizontalScrollView extends HorizontalScrollView {
 //传入的布局
 private View ll_content;
 //更多栏目的布局
 private View ll_more;
 //拖动栏布局
 private View rl_colnmn;
 //左阴影布局
 private ImageView leftImage;
 //右阴影布局
 private ImageView rightImage;
 //屏幕宽度
 private int mScreenWidth =0;
 //父类活动的activity
 private Activity activity;
 public ColumnHorizontalScrollView(Context context) {
  super(context);
 } 

 public ColumnHorizontalScrollView(Context context, AttributeSet attrs) {
  super(context, attrs);
 } 

 public ColumnHorizontalScrollView(Context context, AttributeSet attrs,
          int defStyle) {
  super(context, attrs, defStyle); 

 } 

 /**
  * 拖动的时候执行的事件
  * @param l
  * @param t
  * @param oldl
  * @param oldt
  */
 @Override
 protected void onScrollChanged(int l, int t, int oldl, int oldt) {
  super.onScrollChanged(l, t, oldl, oldt);
  //先设置左右的阴影
  shade_ShowOrHide();
  if(!activity.isFinishing() && ll_content != null && leftImage!= null && rightImage != null){
   if(ll_content.getWidth() <= mScreenWidth){
    leftImage.setVisibility(View.GONE);
    rightImage.setVisibility(View.GONE);
   }
  }else {
   return ;
  }
  if(l == 0){
   leftImage.setVisibility(View.GONE);
   rightImage.setVisibility(View.VISIBLE);
   return ;
  }
  if(ll_content.getWidth() - l + ll_more.getWidth() + rl_colnmn.getLeft() == mScreenWidth){
   leftImage.setVisibility(View.VISIBLE);
   rightImage.setVisibility(View.GONE);
   return ;
  }
  leftImage.setVisibility(View.VISIBLE);
  rightImage.setVisibility(View.VISIBLE);
 } 

 /**
  * 传入父类的资源文件等
  * @param activity
  * @param mScreenWidth
  * @param paramView1
  * @param paramView2
  * @param paramView3
  * @param paramView4
  * @param paramView5
  */
 public void setParam(Activity activity,int mScreenWidth,View paramView1,ImageView paramView2, ImageView paramView3 ,View paramView4,View paramView5)
 {
  this.activity = activity;
  this.mScreenWidth = mScreenWidth;
  ll_content = paramView1;
  leftImage = paramView2;
  rightImage = paramView3;
  ll_more = paramView4;
  rl_colnmn = paramView5;
 }
 /**
  * 判断左右阴影显示隐藏效果
  */
 public void shade_ShowOrHide(){
  if(!activity.isFinishing() && ll_content != null){
   measure(0,0);
   //如果整体的宽度小于屏幕的宽度的话,那左右阴影都隐藏
   if(mScreenWidth >= getMeasuredWidth()){
    leftImage.setVisibility(View.GONE);
    rightImage.setVisibility(View.GONE);
   }
  }else {
   return ;
  }
  //如果滑动到最左边的时候,左边阴影隐藏,右边显示
  if(getLeft() == 0){
   leftImage.setVisibility(View.GONE);
   rightImage.setVisibility(View.VISIBLE);
   return ;
  }
  //如果滑动在最右边的时候,左边阴影显示,右边隐藏
  if(getRight() == getMeasuredWidth() - mScreenWidth){
   leftImage.setVisibility(View.VISIBLE);
   rightImage.setVisibility(View.GONE);
   return ;
  }
  //否则,说明在中间位置,左右阴影都显示
  leftImage.setVisibility(View.VISIBLE);
  rightImage.setVisibility(View.VISIBLE);
 }
} 

完成之后,是不是需要编写Fragment 了? 为了显示图中的效果,这里我们就自定义一个,方便控制

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; 

/**
 * 自定义的Fragment类
 */ 

public class NewsFragment extends Fragment {
 String text; 

 @Override
 public void onCreate(Bundle savedInstanceState) {
  Bundle args = getArguments();
  text = args != null ? args.getString("text"):"";
  super.onCreate(savedInstanceState);
 } 

 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  View view = LayoutInflater.from(getActivity()).inflate(R.layout.news_fragment,null);
  TextView item_textview = (TextView)view.findViewById(R.id.item_textview);
  item_textview.setText(text);
  return view; 

 }
}

news_fragment.xml

Ok,为了方便控制,我们来写个适配器

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.view.ViewGroup; 

import java.util.ArrayList; 

/**
 * 消息 Fragment 的适配器
 */ 

public class NewsFragmentPagerAdapter extends FragmentPagerAdapter {
 private ArrayList<Fragment> fragments;//定义一个集合管理所有的fragment 

 private FragmentManager fm;//fragment 管理器 

 public NewsFragmentPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments) {
  super(fm);
  this.fm = fm;
  this.fragments = fragments;
 }
 @Override
 public int getCount() {
  return fragments.size();
 } 

 @Override
 public android.support.v4.app.Fragment getItem(int position) {
  return fragments.get(position);
 } 

 @Override
 public int getItemPosition(Object object) {
  return POSITION_NONE;
 } 

 //设置集合
 public void setFragments(ArrayList<Fragment> fragments) {
  if(this.fragments != null){
   FragmentTransaction ft = fm.beginTransaction();
   for(Fragment f : this.fragments){
    ft.remove(f);
   }
   ft.commit();
   ft = null;
   fm.executePendingTransactions();
  }
  this.fragments = fragments;
  notifyDataSetChanged();
 } 

 @Override
 public Object instantiateItem(ViewGroup container, int position) {
  Object obj = super.instantiateItem(container, position);
  return obj;
 }
} 

完成这些,就差不多开始编写Activity 的代码了。

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView; 

import java.util.ArrayList; 

/**
 */ 

public class MainActivity extends FragmentActivity {
 /**自定义的HorizontalScrollView**/
 private ColumnHorizontalScrollView mColumnHorizontalScrollView; 

 private LinearLayout mRadioGroup_content; 

 private LinearLayout ll_more_columns; 

 private RelativeLayout rl_colum; 

 private ViewPager mViewPager; 

 private ImageView button_more_columns; 

 private String[] news = new String[] {
  "1","2","3","4","5","6","7","8","9","10"
 };
 //当前选中的栏目
 private int colnmuSelectIndex = 0;
 //左阴影部分
 public ImageView shade_left;
 //右阴影部分
 public ImageView shade_right;
 //屏幕宽度
 private int mScreenWidth = 0; 

 //Item 的高度
 private int mItemWidth = 0; 

 private ArrayList<Fragment> fragments = new ArrayList<>(); 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState); 

  setContentView(R.layout.actiivty_top_news);
  DisplayMetrics dm = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(dm);
  mScreenWidth = dm.widthPixels;
  mItemWidth = mScreenWidth / 7;// 一个Item宽度为屏幕的1/7
  intiViews();
 }
 private final int SWITCH_PAGE = 0x00123; 

 private Handler mHandler = new Handler(){
  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);
   switch (msg.what){
    case SWITCH_PAGE:
     int selectIndex = msg.getData().getInt("selectIndex");
     for(int i = 0;i < mRadioGroup_content.getChildCount();i++){
      View localView = mRadioGroup_content.getChildAt(i);
      if (i != selectIndex)
       localView.setSelected(false);
      else{
       localView.setSelected(true);
       mViewPager.setCurrentItem(i);
      }
     }
     break;
   }
  }
 };
 /**
  * 初始化组件
  */
 protected void intiViews() {
  mColumnHorizontalScrollView = (ColumnHorizontalScrollView)findViewById(R.id.mColumnHorizontalScrollView);
  mRadioGroup_content = (LinearLayout) findViewById(R.id.mRadioGroup_content);
  ll_more_columns = (LinearLayout) findViewById(R.id.ll_more_columns);
  rl_colum = (RelativeLayout) findViewById(R.id.rl_column);
  button_more_columns = (ImageView) findViewById(R.id.button_more_columns);
  mViewPager = (ViewPager) findViewById(R.id.mViewPager);
  shade_left = (ImageView) findViewById(R.id.shade_left);
  shade_right = (ImageView) findViewById(R.id.shade_right);
  button_more_columns.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
   }
  });
  setChangelView();
 }
 /**
  * 当栏目项发生变化时候调用
  * */
 private void setChangelView() {
  // initColumnData();
  initTabColumn();
  initFragment();
 }
 /**
  * 初始化Column栏目项
  * */
 private void initTabColumn() {
  //先删除所有的控件
  mRadioGroup_content.removeAllViews();
  //获取所有的结合
  int count = news.length;
  //设置自定义的所有布局
  mColumnHorizontalScrollView.setParam(this, mScreenWidth, mRadioGroup_content, shade_left, shade_right, ll_more_columns, rl_colum);
  for(int i = 0; i< count; i++){
   LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mItemWidth , ViewPager.LayoutParams.WRAP_CONTENT);
   params.leftMargin = 10;
   params.rightMargin = 10;
   TextView localTextView = new TextView(this);
   localTextView.setTextAppearance(this, R.style.top_category_scroll_view_item_text);
   localTextView.setBackgroundResource(R.drawable.radio_buttong_bg);
   localTextView.setGravity(Gravity.CENTER);
   localTextView.setPadding(5, 0, 5, 0);
   localTextView.setId(i);
   localTextView.setText(news[i]);
   localTextView.setTextColor(getResources().getColorStateList(R.color.top_category_scroll_text_color_day));
   if(colnmuSelectIndex == i){
    localTextView.setSelected(true);
   }
   /**
    * 设置点击事件
    */
   localTextView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     for(int i = 0;i < mRadioGroup_content.getChildCount();i++){
      View localView = mRadioGroup_content.getChildAt(i);
      if (localView != v)
       localView.setSelected(false);
      else{
       localView.setSelected(true);
       mViewPager.setCurrentItem(i);
      }
     }
    }
   });
   mRadioGroup_content.addView(localTextView, i ,params);
  }
 }
 /**
  * 选择的Column里面的Tab
  * */
 private void selectTab(int tab_postion) {
  colnmuSelectIndex = tab_postion;
  for (int i = 0; i < mRadioGroup_content.getChildCount(); i++) {
   View checkView = mRadioGroup_content.getChildAt(tab_postion);
   int k = checkView.getMeasuredWidth();
   int l = checkView.getLeft();
   int i2 = l + k / 2 - mScreenWidth / 2;
   mColumnHorizontalScrollView.smoothScrollTo(i2, 0);
  }
  //判断是否选中
  for (int j = 0; j < mRadioGroup_content.getChildCount(); j++) {
   View checkView = mRadioGroup_content.getChildAt(j);
   boolean ischeck;
   if (j == tab_postion) {
    ischeck = true;
   } else {
    ischeck = false;
   }
   checkView.setSelected(ischeck);
  }
 }
 /**
  * 初始化Fragment
  * */
 private void initFragment() {
  int count = news.length;
  for(int i = 0; i< count;i++){
   Bundle data = new Bundle();
   data.putString("text", news[i]);
   NewsFragment newfragment = new NewsFragment();
   newfragment.setArguments(data);
   fragments.add(newfragment);
  }
  NewsFragmentPagerAdapter mAdapetr = new NewsFragmentPagerAdapter(getSupportFragmentManager(), fragments);
  mViewPager.setAdapter(mAdapetr);
  mViewPager.setOnPageChangeListener(pageListener);
 }
 /**
  * ViewPager切换监听方法
  * */
 public ViewPager.OnPageChangeListener pageListener= new ViewPager.OnPageChangeListener(){ 

  @Override
  public void onPageScrollStateChanged(int arg0) {
  } 

  @Override
  public void onPageScrolled(int arg0, float arg1, int arg2) {
  } 

  @Override
  public void onPageSelected(int position) {
   // TODO Auto-generated method stub
   mViewPager.setCurrentItem(position);
   selectTab(position);
  }
 }; 

} 

actiivty_top_news.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" > 

 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="40.0dip"
  android:background="#fff3f3f3"
  android:orientation="horizontal" > 

  <RelativeLayout
   android:id="@+id/rl_column"
   android:layout_width="match_parent"
   android:layout_height="40.0dip"
   android:layout_weight="1.0" > 

   <cn.com.topnews.ui.ColumnHorizontalScrollView
    android:id="@+id/mColumnHorizontalScrollView"
    android:layout_width="match_parent"
    android:layout_height="40.0dip"
    android:scrollbars="none" > 

    <LinearLayout
     android:id="@+id/mRadioGroup_content"
     android:layout_width="fill_parent"
     android:layout_height="40.0dip"
     android:layout_centerVertical="true"
     android:gravity="center_vertical"
     android:orientation="horizontal"
     android:paddingLeft="10.0dip"
     android:paddingRight="10.0dip" />
   </cn.com.topnews.ui.ColumnHorizontalScrollView> 

   <ImageView
    android:id="@+id/shade_left"
    android:layout_width="10.0dip"
    android:layout_height="40.0dip"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:background="@drawable/channel_leftblock"
    android:visibility="gone" /> 

   <ImageView
    android:id="@+id/shade_right"
    android:layout_width="10.0dip"
    android:layout_height="40.0dip"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:background="@drawable/channel_rightblock"
    android:visibility="visible" />
  </RelativeLayout> 

  <LinearLayout
   android:id="@+id/ll_more_columns"
   android:layout_width="wrap_content"
   android:layout_height="40.0dip" > 

   <ImageView
    android:id="@+id/button_more_columns"
    android:layout_width="40.0dip"
    android:layout_height="40.0dip"
    android:layout_gravity="center_vertical"
    android:src="@drawable/channel_glide_day_bg" />
  </LinearLayout>
 </LinearLayout> 

 <View
  android:id="@+id/category_line"
  android:layout_width="fill_parent"
  android:layout_height="0.5dip"
  android:background="#ffdddddd" /> 

 <android.support.v4.view.ViewPager
  android:id="@+id/mViewPager"
  android:layout_width="match_parent"
  android:layout_height="match_parent" /> 

</LinearLayout> 

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

(0)

相关推荐

  • Android TextView显示Html类解析的网页和图片及自定义标签用法示例

    本文实例讲述了Android TextView显示Html类解析的网页和图片及自定义标签.分享给大家供大家参考,具体如下: Android系统显示HTML网页的最佳控件为WebView,有时候为了满足特定需求,需要在TextView中显示HTML网页.图片及解析自定义标签. 1.TextView显示Html类解析的网页 CharSequence richText = Html.fromHtml("<strong>萝卜白菜的博客</strong>--<a href='

  • Android中使用TagFlowLayout制作动态添加删除标签

    效果图 简单的效果图(使用开源库)[FlowLayout](" https://github.com/hongyangAndroid/FlowLayout ") 步骤 导包 compile 'com.zhy:flowlayout-lib:1.0.3' <com.zhy.view.flowlayout.TagFlowLayout android:id="@+id/id_flowlayout" zhy:max_select="-1" andro

  • Android Navigation TabBar控件实现多彩标签栏

    先看看效果图: 源码下载:Android Navigation TabBar控件实现多彩标签栏 代码: MainActivity.java package com.bzu.gxs.meunguide; import android.app.Activity; import android.graphics.Color; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; im

  • Android 仿淘宝商品属性标签页

    需求 1.动态加载属性,如尺码,颜色,款式等 由于每件商品的属性是不确定的,有的商品的属性是颜色和尺码,有的是口味,有的是大小,所以这些属性不能直接写死到页面上. 2.动态加载属性下的标签 每个属性下的标签个数也不是一定的,比如有的商品的尺码是是S,M,XL,有的是均码,也就是每种属性的具体的内容是不一定的. 技术点 自定义ViewGroup,使其中的TextView可以依据内容长短自动换行,如下图所示 实现 布局 通过ListView来显示商品所有属性,每种属性作为ListView的Item.

  • Android自定义控件ViewGroup实现标签云(四)

    前言: 前面几篇讲了自定义控件绘制原理Android自定义控件基本原理详解(一) ,Android自定义控件之自定义属性(二) ,Android自定义控件之自定义组合控件(三),常言道:"好记性不如烂笔头,光说不练假把式!!!",作为一名学渣就是因为没有遵循这句名言才沦落于此,所以要谨遵教诲,注重理论与实践相结合,今天通过自定义ViewGroup来实现一下项目中用到的标签云. 需求背景: 公司需要实现一个知识点的标签显示,每个标签的长度未知,如下图所示 基本绘制流程: 绘制原理这里不再

  • Android模仿微信收藏文件的标签处理功能

    最近需要用到微信的标签功能(如下图所示).该功能可以添加已有标签,也可以自定义标签.也可以删除已编辑菜单.研究了一番.发现还是挺有意思的,模拟实现相关功能. 该功能使用类似FlowLayout的功能.Flowlayout为一个开源软件(https://github.com/ApmeM/android-flowlayout),功能为自动换行的布局类型 import android.content.Context; import android.util.AttributeSet; import a

  • Android仿新闻顶部导航标签切换效果

    最近由于个人兴趣原因,写了个模仿新闻顶部导航标签的demo.具体看下图. 那么大致上我们会用到这些知识. 1.Fragment 2.FragmentPagerAdapter 3.HorizontalScrollView 4.PopupWindow ok,那么首先进入第一步. 为了实现顶部的标签,我们要用到HorizontalScrollView,因为原有的HorizontalScrollView控件已经不能满足我们的使用了.所以这里就自定义一个HorizontalScrollView impor

  • jquery实现的仿天猫侧导航tab切换效果

    本文实例讲述了jquery实现的仿天猫侧导航tab切换效果.分享给大家供大家参考.具体如下: 这里演示jquery实现仿天猫侧导航tab切换效果,引入外部JS,若初次运行有错误请刷新一页面即可.本菜单是仿天猫商城的菜单,大块的div菜单,支持超多的产品分类,大网站风格,大气实用的多分类网页菜单. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-ftmail-nav-tab-cha-codes/ 具体代码如下: <!DOCTYPE h

  • Android仿qq顶部消息栏效果

    android仿照qq的顶部栏效果,主要就是利用fragment manager把fragment设置显示内容 (1)在activity_main.xml布局中添加控件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="

  • Android仿支付宝的头部伸缩动画效果

    Android5.0推出的MaterialDesign库包含了处理头部工具栏的多个控件,不但允许自定义顶部导航栏,而且导航栏高度是可以伸缩的.如此一来,一方面导航栏能够放得下更多控件,另一方面在用户想看具体内容时也能腾出更多的屏幕空间. 这么说可能比较抽象,那就先来看看两张导航栏的效果图,第一张是导航栏完全展开时的界面,此时页面头部的导航栏占据了较大部分的高度: 第二张是导航栏完全收缩时的界面,此时头部导航栏只剩矮矮的一个长条. 看起来很眼熟是不是,上面的截图正是仿支付宝首页的头部效果.如果你熟

  • uni app仿微信顶部导航条功能

    最近一直在学习uni-app开发,由于uniapp是基于vue.js技术开发的,只要你熟悉vue,基本上很快就能上手了. 在开发中发现uni-app原生导航栏也能实现一些顶部自定义按钮+搜索框,只需在page.json里面做一些配置即可.设置app-plus,配置编译到App平台的特定样式.dcloud平台对app-plus做了详细说明:app-plus配置,需注意 目前暂支持H5.App端,不支持小程序. 在page.json里配置app-plus即可 { "path": "

  • uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能

    最近一直在学习uni-app开发,由于uniapp是基于vue.js技术开发的,只要你熟悉vue,基本上很快就能上手了. 在开发中发现uni-app原生导航栏也能实现一些顶部自定义按钮+搜索框,只需在page.json里面做一些配置即可.设置app-plus,配置编译到App平台的特定样式.dcloud平台对app-plus做了详细说明:app-plus配置,需注意 目前暂支持H5.App端,不支持小程序. 在page.json里配置app-plus即可 { "path": "

  • js实现的tab标签切换效果代码分享

    这是一款基于js实现的tab标签切换效果,是一款无需jQuery,原生javascript制作的tab切换效果源码.点击上面的标题即可实现对应页面的切换功能,非常具有实用价值. 运行效果图:-------------------查看效果 下载源码------------------- 小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式. 为大家分享的js实现的tab标签切换效果代码如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans

  • 基于Bootstrap实现tab标签切换效果

    本文实例为大家分享了Bootstrap实现tab标签切换效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" href="css/bootstrap.min.css" /> <script

  • JS+DIV+CSS实现的经典标签切换效果代码

    本文实例讲述了JS+DIV+CSS实现的经典标签切换效果代码.分享给大家供大家参考.具体如下: 这里演示JS+DIV+CSS实现的标签切换效果代码,通俗说就是滑动门的实现效果,很不错的实例,希望对你学习JS+CSS布局有帮助. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-div-css-bq-cha-tab-style-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML

  • ViewPager顶部导航栏联动效果(标题栏条目多)

    如果标题栏过多,超过屏幕的宽度,该怎么弄,下面我们就来解决一下,效果如下: 其实和之前写的也差不多,我就是在哪个demo里面添加和修改了一下,就加了几个title标题,加了几个图片,最重要的是给TableLayout添加了一个属性: app:tabMode="scrollable" 这个属性就是设置设置TableLayout可以滚动,看我滚动上面的标题栏: 这里我还给标题栏设置了几个附加的属性,让它显得更好看: <span style="white-space:pre&

随机推荐