1. 程式人生 > >Andriod 自定義 RecyclerView 打造超強 Gallery效果 橫向滑動 完整例項原始碼

Andriod 自定義 RecyclerView 打造超強 Gallery效果 橫向滑動 完整例項原始碼

       Andriod 自定義 RecyclerView 打造超強 Gallery效果 橫向ListView 完整例項原始碼

      大家好,一個RecyclerView 橫向滑動的效果是不是值得借鑑呢,下面我們來看看我做的效果:

(記得匯入RecyclerView的包哦   導包步驟:  點選開啟連結)



下面是需求的效果圖:



     因為需要做一個天氣的介面效果,所以之前沒有經驗的我不得不搜尋資料來實現,下面我們來看看程式碼吧:

1.Activity

public class MainActivity extends AppCompatActivity implements RecyAdapter.OnItemClickListener {


    private String TAG="HorizontalActivity";

    private Integer[] mImgIds = {R.mipmap.weather, R.mipmap.ic_launcher, R.mipmap.weather, R.mipmap.ic_launcher, R.mipmap.weather,
            R.mipmap.weather, R.mipmap.ic_launcher_round, R.mipmap.ic_launcher, R.mipmap.weather, R.mipmap.ic_launcher_round, R.mipmap.weather};
    private List<Integer> datas;
    private RecyAdapter recyAdapter;
    private Handler mHandler=new Handler();
    private LinearLayoutManager layoutManager;

    private int oldItem=0;
    private RecyclerView recyclerview;
    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        img = (ImageView) findViewById(R.id.img);
        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
        initData();
        initRecy();
        
        img.setImageResource(datas.get(0));
        recyAdapter.setOnItemClickListener(this);

    }

    private void initRecy() {
        recyAdapter=new RecyAdapter(this,datas);

        layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerview.setLayoutManager(layoutManager);
        recyclerview.setAdapter(recyAdapter);

    }

    private void initData() {
        datas=new ArrayList<>();
        for (int i = 0; i <mImgIds.length ; i++) {
            datas.add(mImgIds[i]);
        }

    }
//    Runnable scrollRunnable=new Runnable() {
//        @Override
//        public void run() {
//            recyclerview.scrollBy(3,0);
//
////      int firstItem = layoutManager.findFirstVisibleItemPosition();
//            int firstItem=layoutManager.findFirstVisibleItemPosition();
//            if(firstItem!=oldItem&&firstItem>0){
//                oldItem=firstItem;
//                img.setImageResource(datas.get(oldItem%datas.size()));
//            }
//
//            Log.e(TAG, "run: firstItem:"+firstItem );
//
//
//            mHandler.postDelayed(scrollRunnable,10);
//        }
//    };



    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {

    }
    @Override
    protected void onResume() {
        super.onResume();
//        mHandler.postDelayed(scrollRunnable,10);
    }

    @Override
    protected void onStop() {
        super.onStop();
//        mHandler.removeCallbacks(scrollRunnable);
    }

    @Override
    public void onItemClick(View view, int tag) {
//        img.setImageResource(datas.get(tag));//設定圖片
        Toast.makeText(this,"第"+tag+"張圖片被點選了",Toast.LENGTH_SHORT).show();
    }

}

2.RecyAdapter
public class RecyAdapter extends RecyclerView.Adapter<RecyAdapter.ViewHolder> implements View.OnClickListener {

    private Context context;
    private List<Integer> datas;
    private OnItemClickListener onItemClickListener;

    public RecyAdapter(Context context, List<Integer> datas) {
        this.context = context;
        this.datas = datas;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_horizontal, parent, false);
        ViewHolder vh=new ViewHolder(view);
        view.setOnClickListener(this);
        return vh;
    }


    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        int newPos=position%datas.size();

        holder.img.setImageResource(datas.get(newPos));

        holder.itemView.setTag(position);


    }

    @Override
    public int getItemCount() {
        return datas.size();
    }//Integer.MAX_VALUE

    @Override
    public void onClick(View view) {
        if(onItemClickListener!=null){
            onItemClickListener.onItemClick(view, (Integer) view.getTag());
        }
    }


    class ViewHolder extends RecyclerView.ViewHolder {
        ImageView img;
        public ViewHolder(View itemView) {
            super(itemView);
            img=itemView.findViewById(R.id.img);
        }
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        this.onItemClickListener=listener;

    }
    interface OnItemClickListener{
        void onItemClick(View view,int tag);
    }

}


3.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ImageView
        android:layout_width="300dp"
        android:layout_height="350dp"
        android:layout_gravity="center_horizontal"
        android:id="@+id/img"
        android:src="@mipmap/ic_launcher"
        android:scaleType="fitXY"
        />

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:layout_marginTop="10dp"
        android:id="@+id/recyclerview"
        ></android.support.v7.widget.RecyclerView>



</LinearLayout>


4.item_horizontal.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="32dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_height="match_parent"
    android:orientation="vertical"

    >
    <TextView
        android:layout_width="match_parent"
        android:text="現在"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:layout_height="wrap_content" />

    <ImageView
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:id="@+id/img"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:scaleType="fitXY"
        />
    <TextView
        android:layout_width="match_parent"
        android:text="15º"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:layout_height="wrap_content" />


</LinearLayout>

     對,就是這麼簡單,你值得擁有+   上Demo:    點選下載原始碼      點選下載原始碼2

相關推薦

Andriod 定義 RecyclerView 打造超強 Gallery效果 橫向滑動 完整例項原始碼

       Andriod 自定義 RecyclerView 打造超強 Gallery效果 橫向ListView 完整例項原始碼       大家好,一個RecyclerView 橫向滑動的效果是不是值得借鑑呢,下面我們來看看我做的效果: (記得匯入RecyclerVi

Android定義view-打造酷炫的字型滑動高亮控制元件

前言: 相信很多時候開發會遇到類似於音樂歌詞同步,播放到哪句歌詞的哪個詞時會逐漸高亮,這樣的描述還是不夠準確,iPhone的滑動解鎖的那種效果,相信很多人都會熟悉吧。今天,我們的首要任務就是開發一個類似於這種效果的安卓控制元件,以便在以後的專案中直接使用,看起來高大上有木有

java netty socket庫和定義C#socket庫利用protobuf進行通訊完整例項

之前的文章講述了socket通訊的一些基本知識,已經本人自定義的C#版本的socket、和java netty 庫的二次封裝,但是沒有真正的發表測試用例。 本文只是為了講解利用protobuf 進行C# 和 java的通訊。以及完整的例項程式碼 java 程式碼 svn 地址,本人開發工具是NetBean

Android 定義RecyclerView 實現真正的Gallery效果

上一篇部落格我使用自定義HorizontalScrollView寫了一個具有HorizontalScrollView效果和ViewPager特性的橫向圖片輪播,詳見:Android 自定義 HorizontalScrollView 打造再多圖片(控制元件)也不怕 OOM 的橫

RecyclerView定義LayoutManager,打造不規則佈局

本文已授權微信公眾號:鴻洋(hongyangAndroid)在微信公眾號平臺原創首發。 RecyclerView的時代 自從google推出了RecyclerView這個控制元件, 鋪天蓋地的一頓叫好, 開發者們也都逐漸從ListView,GridView等控制元件

Android 定義 ViewPager 打造千變萬化的圖片切換效果

                記得第一次見到ViewPager這個控制元件,瞬間愛不釋手,做東西的主介面通通ViewPager,以及圖片切換也拋棄了ImageSwitch之類的,開始讓ViewPager來做。時間長了,ViewPager的切換效果覺得枯燥,形成了審美疲勞~~我們需要改變,今天教大家如何改變V

Android 定義 HorizontalScrollView 打造再多圖片(控制元件)也不怕 OOM 的橫向滑動效果

自從Gallery被谷歌廢棄以後,Google推薦使用ViewPager和HorizontalScrollView來實現Gallery的效果。的確HorizontalScrollView可以實現Gallery的效果,但是HorizontalScrollView存在一個很大的問

Android 使用極光推送定義訊息打造個性的訊息推送效果

極光推送,是一個面向普通開發者開放的,免費的第三方訊息推送服務。本篇部落格將結合案例介紹極光推送自定義訊息的使用方法,利用自定義訊息實現專案中特定的訊息推送需求。 本案例將實現如圖效果: 參考官方Android SDK 教程完成鐳射推送的基本配置 區

Android定義RecyclerView分割線,打造無邊緣分割線

前言:  現在的RecyclerView幾乎已經完全取代ListView和GridView了,已經幾年沒使用ListView和GridView了,想當年還需要自己在getView方法中複用convertView。而現在的RecyclerView一出生就被設計成

Android定義View——實現水波紋效果類似剩余流量球

string 三個點 pre ber block span 初始化 move 理解 最近突然手癢就想搞個貝塞爾曲線做個水波紋效果玩玩,終於功夫不負有心人最後實現了想要的效果,一起來看下吧: 效果圖鎮樓 一:先一步一步來分解一下實現的過程 需要繪制一個正弦曲線(sin

利用echarts highcharts 實現定義地圖 關系圖效果 側邊3D柱形圖餅圖散點圖

技術 ges 散點圖 chart blog 餅圖 git 分享 charts github 地址: https://https://github.com/Gengshaoxuan/medataMap github 地址: https://https://github.c

Android 定義View實現拖拽效果

騰訊QQ有那種紅點拖動效果,今天就來實現一個簡單的自定義View拖動效果,再回到原處,並非完全仿QQ紅點拖動 先來看一下效果圖 簡單說一下實現步驟 1.建立一個類繼承View 2.繪製出一個

Android 定義View實現圓形環繞效果

之前專案中需要實現一個四周環繞中心圓形頭像的效果,感覺還是自定義比較方便,於是就自己封裝了一個控制元件去實現。先貼張圖顯示最終效果。 首先自定義一個View繼承自LinearLayout,通過動態新增childView的方式將子控制元件新增到View中。思路是先新增中間圓形頭像

Android 定義PopupWindow實現懸浮窗效果

  有時候我們需要在介面上彈出一個視窗,而Android中彈出窗體有兩種方式:一種是AlertDialog,另一種就是PopupWindow,AlertDialog的位置是固定的,而PopupWindow的位置可以任意指定。下面我們使用自定義的PopupWindow來完成以下的效果圖:

定義view實現水波紋效果

自定義view實現水波紋效果 參考csdn大神 啟艦的部落格http://blog.csdn.net/harvic880925/article/details/50995587,自己實現了一遍,碰到的坑有2個: 1、記得呼叫mPath.reset(),否則每次的path內容會疊

【我的Android進階之旅】定義控制元件之使用ViewPager實現可以預覽的畫廊效果,並且定義畫面切換的動畫效果的切換時間

我們來看下效果 在這裡,我們實現的是,一個ViewPager來顯示圖片列表。這裡一個頁面,ViewPage展示了前後的預覽,我們讓預覽頁進行Y軸的壓縮,並設定透明度為0.5f,所有我們看到gif最後,左右兩邊的圖片有點朦朧感。讓預覽頁和主頁面有主從感。我們用分

Android定義ViewGroup打造各種風格的SlidingMenu

看鴻洋大大的QQ5.0側滑選單的視訊課程,對於側滑的時的動畫效果的實現有了新的認識,似乎打通了任督二脈,目前可以實現任意效果的側滑選單了,感謝鴻洋大大!! 鴻洋大大用的是HorizontalScrollView來實現的側滑選單功能,HorizontalScro

android定義View之3D索引效果

效果圖: 我的小霸王太卡了。 最近工作比較忙,今天搞了一下午才搞出來這個效果,這種效果有很多種實現方式,最常見的應該是用貝塞爾曲線實現的。今天我們來看另一種不同的實現方式,只需要用到 canvas.scale(),有沒有很好奇是怎麼實現的呢。 首先來說一下思路,只要有了思

android 定義view之側滑效果

效果圖: 看網上的都是兩個view拼接,預設右側的不顯示,水平移動的時候把右側的view顯示出來。但是看最新版QQ上的效果不是這樣的,但給人的感覺卻很好,所以獻醜來一發比較高仿的。 知識點: 1、ViewDragHelper 的用法; 2、滑動衝突的解決; 3、自定

定義控制元件,動畫效果的進度圓環RingProgressBar

自定義動畫效果的進度圓環RingProgressBar 專案中有一個進度圓環,實現一個比例的顯示,原生的ProgressBar就算自定義樣式也不是很美觀,於是就自定義了一個,繼承於View類,效果如下: 程式碼 import android