一個(gè)仿網(wǎng)易、今日頭條的圖片游覽器

一個(gè)仿網(wǎng)易丢早、今日頭條的圖片游覽器

好吧姨裸,我承認(rèn),這一階段自己偷懶了怨酝,今天趁著周末傀缩,也沒(méi)有面試,來(lái)記錄一下最近的項(xiàng)目中用到的吧农猬,一個(gè)仿網(wǎng)易赡艰、今日頭條的圖片游覽器。
實(shí)現(xiàn)也是很簡(jiǎn)單的斤葱,這里用到了git上的一個(gè)開(kāi)源庫(kù)PhotoView慷垮,大家可以下載研究一下。地址:https://github.com/chrisbanes/PhotoView
項(xiàng)目引入就不多說(shuō)揍堕,如果有疑問(wèn)料身,可以參考我的另一篇blog,Android Studio如何正確引入AS和ES項(xiàng)目
我這里是把他這里的代碼copy到了自己的項(xiàng)目中(另一種引入項(xiàng)目的方式)衩茸。
接下來(lái)我們就來(lái)看下具體的實(shí)現(xiàn)吧芹血。
MainActivity.java:
這個(gè)就簡(jiǎn)單了,布局里面就一個(gè)button用于跳轉(zhuǎn),模擬點(diǎn)擊圖片進(jìn)入圖片游覽器中查看詳情:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_start).setOnClickListener(new OnClickListener());
    }

    class OnClickListener implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            startActivity(new Intent(MainActivity.this,NewsViewPagerActivity.class));
        }
    }

}

activity_mian.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"
    >
    <Button
        android:id="@+id/btn_start"
        android:text="點(diǎn)擊顯示圖片游覽器"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

然后在NewsViewPagerActivity這個(gè)類中處理我們的邏輯:

package com.example.phototour;

import android.annotation.SuppressLint;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.phototour.photoview.HackyViewPager;
import com.example.phototour.photoview.PhotoView;

public class NewsViewPagerActivity extends AppCompatActivity {

    //圖片資源幔烛,這個(gè)地方可以改成從網(wǎng)絡(luò)中獲取到的圖片
    private int[] images = {R.mipmap.img1, R.mipmap.img2, R.mipmap.img3, R.mipmap.img4,
            R.mipmap.img5, R.mipmap.img6};

    //圖片資源
    private int[] cars = {R.mipmap.car1, R.mipmap.car2, R.mipmap.car3, R.mipmap.car4, R.mipmap.car5, R.mipmap.car6, R.mipmap.car7};

    //圖片的文字描述啃擦,在實(shí)際項(xiàng)目中這個(gè)是從后臺(tái)獲取到的數(shù)據(jù),在這里模擬一下
    private String[] descs = {
            "小周非常喜歡《變形金剛》系列科幻電影饿悬,于是就話了" +
                    "28萬(wàn)好不容易的買(mǎi)了一臺(tái)二手年齡5年的雪佛蘭大黃蜂令蛉,其有這和第一步《變形金剛》基本一樣的造型,非常經(jīng)典美觀"
            ,
            "原車主也是一位典型的《變形金剛》影迷乡恕,據(jù)悉這部電影給雪佛蘭科邁羅帶來(lái)了幾十萬(wàn)臺(tái)的全球銷量" +
                    "言询,小周就是其中一位,犀利的前細(xì)長(zhǎng)的純黑色中網(wǎng)顯得非常精致" +
                    "傲宜,引擎蓋有著最純粹的美式肌肉感"
            ,
            "但是小周花了這么貴的價(jià)錢(qián)買(mǎi)下來(lái)的二手大黃蜂运杭,因?yàn)檫@是一臺(tái)非常純粹的美系列肌肉車,排量達(dá)到了" +
                    "驚人的3.6L,加上已經(jīng)5年的車齡函卒,小周經(jīng)常要去加油站加油辆憔,第一因?yàn)橛秃奶螅诙驗(yàn)猷]箱太小"
            ,
            "但是這臺(tái)大黃蜂還是回頭率達(dá)到了驚人的95%报嵌,很像雪佛蘭邁銳寶的尾燈虱咧,給人強(qiáng)烈的質(zhì)感,而粗狂的排氣管則給人強(qiáng)烈的肌肉感"
            ,
            "來(lái)到這款大黃蜂的車廂锚国,看到了這最新的三幅式的真皮多功能的方向盤(pán)腕巡,后面的換擋撥片給人強(qiáng)烈的操控感"
            ,
            "中控臺(tái)非常簡(jiǎn)潔,但是車載導(dǎo)航卻沒(méi)有血筑,這點(diǎn)需要吐槽绘沉,全程需要用手機(jī)"
            , "駕駛艙是純黑色的,而內(nèi)飾采用了很" +
            "高級(jí)的高級(jí)絨布材質(zhì)鋪就豺总,座駕的包裹性很強(qiáng)车伞,可以8向調(diào)節(jié),按摩喻喳,座椅記憶另玖,加熱通風(fēng)等功能,非常實(shí)用"};
    //photoview里面的自定義的方法  重寫(xiě)了onInterceptTouchEvent  onTouchEvent來(lái)處理事件
    private HackyViewPager mViewPager;
    //顯示頁(yè)數(shù)和當(dāng)前頁(yè)數(shù)
    private TextView picture_iv_index;
    //返回按鈕
    private ImageView picture_iv_back;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news_view_pager);
        initView();
        initParams();
    }


    //初始化參數(shù)
    private void initParams() {
        picture_iv_index.setText("1/" + images.length + descs[0]);
        // 綁定適配器
        mViewPager.setAdapter(new ViewPagerAdapter());
        //設(shè)置可以滑動(dòng)監(jiān)聽(tīng)(viewpager改變的時(shí)候調(diào)用)
        mViewPager.setOnPageChangeListener(new ViewPagerChangeListener());
        mViewPager.setCurrentItem(0);
        picture_iv_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                NewsViewPagerActivity.this.finish();
            }
        });
    }

    //初始化布局控件
    private void initView() {
        mViewPager = (HackyViewPager) findViewById(R.id.photo_vp);
        picture_iv_back = (ImageView) findViewById(R.id.picture_iv_back);
        picture_iv_index = (TextView) findViewById(R.id.picture_iv_index);
    }

    // 查看大圖viewpager適配器
    private class ViewPagerAdapter extends PagerAdapter {

        @SuppressLint("InflateParams")
        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
            View view = getLayoutInflater().inflate(R.layout.news_picture_item, null);
            PhotoView picture_iv_item = (PhotoView) view.findViewById(R.id.picture_iv_item);
            // 給imageview設(shè)置一個(gè)tag表伦,保證異步加載圖片時(shí)不會(huì)亂序
            // AsyncImageLoader.getInstance(NewsPictureActivity.this).loadBitmaps(view, picture_iv_item, ConstantsUtil.IMAGE_URL + dataList.get(position).url, LocalApplication.getInstance().screenW, 0);
            picture_iv_item.setImageResource(cars[position]);
            //把view加載到父容器中
            container.addView(view);
            return view;
        }

        @Override
        public int getCount() {
            return cars.length;
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            View view = (View) object;
            container.removeView(view);
        }

    }


    // viewpager切換監(jiān)聽(tīng)器
    private class ViewPagerChangeListener implements ViewPager.OnPageChangeListener {
        @Override
        public void onPageScrollStateChanged(int arg0) {
        }

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

        @Override
        public void onPageSelected(int arg0) {
            //設(shè)置文字
            picture_iv_index.setText((arg0 + 1) + "/" + images.length + " " + descs[0+arg0]);
        }

    }


}

看下activity_news_view_pager.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black">

    <com.example.phototour.photoview.HackyViewPager
        android:id="@+id/photo_vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:persistentDrawingCache="animation"/>

    <ImageView
        android:id="@+id/picture_iv_back"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="24dp"
        android:scaleType="fitCenter"
        android:src="@mipmap/picture_ic_back"
        android:layout_width="36dp"
        android:layout_height="24dp"/>

    <TextView
        android:id="@+id/picture_iv_index"
        android:layout_gravity="center_vertical|bottom|left"
        android:layout_marginBottom="40dp"
        android:text="1/10"
        android:textColor="@color/white"
        android:textSize="18sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_gravity="bottom"
        android:layout_marginBottom="10dp"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/like"
            android:layout_marginRight="60dp"
            android:layout_centerVertical="true"
            android:src="@mipmap/listpage_more_like_normal"
            android:layout_width="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_height="wrap_content"/>
        <ImageView
            android:src="@mipmap/ic_repeat_white_18dp"
            android:layout_width="wrap_content"
            android:layout_marginRight="20dp"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:layout_height="wrap_content"/>
    </RelativeLayout>

</FrameLayout>

news_picture_item.xml:
這個(gè)就更簡(jiǎn)單了谦去,里面就只有一個(gè)photoview用來(lái)顯示圖片(支持縮放)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    android:gravity="center" >

    <com.example.phototour.photoview.PhotoView
        android:id="@+id/picture_iv_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

好了,基本的情況就可以實(shí)現(xiàn)了蹦哼,這里我的圖片資源有限哪轿,界面的優(yōu)化就暫不處理,如果需要的可以反編譯一下翔怎,獲得app里面的圖片資源來(lái)裝飾你的app吧窃诉。我們來(lái)看下效果圖;

這里寫(xiě)圖片描述

好了杨耙,這里上傳一下github地址,大家可以下載研究飘痛。里面的幾個(gè)重要的工具類可以在項(xiàng)目中看到珊膜,這里就不上傳代碼了:https://github.com/wuyinlei/phototour

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宣脉,隨后出現(xiàn)的幾起案子车柠,更是在濱河造成了極大的恐慌,老刑警劉巖塑猖,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹祷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡羊苟,警方通過(guò)查閱死者的電腦和手機(jī)塑陵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蜡励,“玉大人令花,你說(shuō)我怎么就攤上這事×挂校” “怎么了兼都?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)稽寒。 經(jīng)常有香客問(wèn)我扮碧,道長(zhǎng),這世上最難降的妖魔是什么杏糙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任慎王,我火速辦了婚禮,結(jié)果婚禮上搔啊,老公的妹妹穿的比我還像新娘。我一直安慰自己北戏,他們只是感情好负芋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著嗜愈,像睡著了一般旧蛾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蠕嫁,一...
    開(kāi)封第一講書(shū)人閱讀 49,798評(píng)論 1 290
  • 那天锨天,我揣著相機(jī)與錄音,去河邊找鬼剃毒。 笑死病袄,一個(gè)胖子當(dāng)著我的面吹牛搂赋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播益缠,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脑奠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了幅慌?” 一聲冷哼從身側(cè)響起宋欺,我...
    開(kāi)封第一講書(shū)人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胰伍,沒(méi)想到半個(gè)月后齿诞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骂租,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年祷杈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩咨。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吠式,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抽米,到底是詐尸還是另有隱情特占,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布云茸,位于F島的核電站是目,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏标捺。R本人自食惡果不足惜懊纳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亡容。 院中可真熱鬧嗤疯,春花似錦、人聲如沸闺兢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屋谭。三九已至脚囊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桐磁,已是汗流浹背悔耘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留我擂,地道東北人衬以。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓缓艳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親泄鹏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子郎任,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容