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