android recyclerview添加一個(gè)可放大的圖片作為頭部view

39.jpg
18.jpg
圖片.gif

1.透明式狀態(tài)欄

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //使?fàn)顟B(tài)欄透明
            this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

            // 如果想要給狀態(tài)欄加點(diǎn)顏色,例如加點(diǎn)透明的陰影舒萎,就需要加上下面的三行代碼
            // 這是生成一個(gè)狀態(tài)欄大小的矩形骡男,給這個(gè)矩形添加顏色惦积,添加 statusView 到布局中
            View statusView = createStatusView(color);
            ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView();
            decorView.addView(statusView);


            // 設(shè)置根布局的參數(shù)
            ViewGroup rootView = (ViewGroup) ((ViewGroup) this.findViewById(android.R.id.content)).getChildAt(0);
            rootView.setFitsSystemWindows(false);
            rootView.setClipToPadding(true);
        }

/**
     *這個(gè)生成一個(gè)狀態(tài)欄大小的矩形接癌,給這個(gè)矩形,添加 statusView 到布局中
     * @param color
     * @return
     */
    private View createStatusView(int color) {
        // 獲得狀態(tài)欄高度
        int resourceId = this.getResources().getIdentifier("status_bar_height", "dimen", "android");
        int statusBarHeight = this.getResources().getDimensionPixelSize(resourceId);

        // 繪制一個(gè)和狀態(tài)欄一樣高的矩形
        View statusView = new View(this);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                statusBarHeight);
        statusView.setLayoutParams(params);
        statusView.setBackgroundColor(color);
        return statusView;
    }

圖片一與圖片二差別就是rootView.setFitsSystemWindows(false);圖一是false ,圖二是true

2.圖片的縮放

主要代碼:

package com.example.sunxiaokun.status;

import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.example.sunxiaokun.testcoordinatorlayout.R;

/**
 * Created by sunxiaokun on 2016/8/31.
 */
public class TranslucationActivity extends Activity {
    private RecyclerView mAnim_rv;
    private ImageView img_mine_background;
    // 記錄首次按下位置
    private float mFirstPosition = 0;
    // 是否正在放大
    private Boolean mScaling = false;

    private DisplayMetrics metric;
    private TransAdapter mTransAdapter;
    private LinearLayoutManager mLinearLayoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_translution);
        setColor(Color.parseColor("#33000000"));

        mAnim_rv = (RecyclerView) findViewById(R.id.rcv_trans);
        if(mLinearLayoutManager == null){
            mLinearLayoutManager = new LinearLayoutManager(this);
        }
        mAnim_rv.setLayoutManager(mLinearLayoutManager);
        if (mTransAdapter == null)
            mTransAdapter = new TransAdapter(this);
        mAnim_rv.setAdapter(mTransAdapter);
        mTransAdapter.setOnTouchClick(new OnTouchClick() {
            @Override
            public void onTouch(ImageView view) {
                img_mine_background = view;
                metric = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(metric);
                LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) img_mine_background.getLayoutParams();
                lp.width = metric.widthPixels;
                lp.height = metric.widthPixels * 9 / 16;
                img_mine_background.setLayoutParams(lp);
                initzoomimage();
            }
        });

    }


    /**
     * 這里我設(shè)置的圖片在狀態(tài)欄的下面规肴,并且給狀態(tài)欄設(shè)置了一個(gè)淺淺的透明色侯勉。
     *
     * @param color
     */
    public void setColor(int color) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //使?fàn)顟B(tài)欄透明
            this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

            // 如果想要給狀態(tài)欄加點(diǎn)顏色鹦筹,例如加點(diǎn)透明的陰影,就需要加上下面的三行代碼
            // 這是生成一個(gè)狀態(tài)欄大小的矩形址貌,給這個(gè)矩形添加顏色铐拐,添加 statusView 到布局中
            View statusView = createStatusView(color);
            ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView();
            decorView.addView(statusView);


            // 設(shè)置根布局的參數(shù)
            ViewGroup rootView = (ViewGroup) ((ViewGroup) this.findViewById(android.R.id.content)).getChildAt(0);
            // 這個(gè)是決定我們的布局是否是在狀態(tài)欄的下面
            rootView.setFitsSystemWindows(false);
            rootView.setClipToPadding(true);
        }

    }


    /**
     *這個(gè)生成一個(gè)狀態(tài)欄大小的矩形,給這個(gè)矩形芳誓,添加 statusView 到布局中
     * @param color
     * @return
     */
    private View createStatusView(int color) {
        // 獲得狀態(tài)欄高度
        int resourceId = this.getResources().getIdentifier("status_bar_height", "dimen", "android");
        int statusBarHeight = this.getResources().getDimensionPixelSize(resourceId);

        // 繪制一個(gè)和狀態(tài)欄一樣高的矩形
        View statusView = new View(this);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                statusBarHeight);
        statusView.setLayoutParams(params);
        statusView.setBackgroundColor(color);
        return statusView;
    }


    /**
     * 圖片縮放的處理
     */
    private void initzoomimage() {

        mAnim_rv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) img_mine_background.getLayoutParams();
                switch (event.getAction()) {
                    case MotionEvent.ACTION_UP:
                        mScaling = false;
                        replyImage();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        if (!mScaling) {
                            //當(dāng)圖片也就是第一個(gè)item完全可見的時(shí)候余舶,記錄觸摸屏幕的位置
                            if (mLinearLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
                                mFirstPosition = event.getY();
                            } else {
                                break;
                            }
                        }
                        int distance = (int) ((event.getY() - mFirstPosition)* 0.6); // 滾動(dòng)距離乘以一個(gè)系數(shù)
                        if (distance < 0) {
                            break;
                        }
                        // 處理放大
                        mScaling = true;
                        lp.width = metric.widthPixels + distance;
                        lp.height = (metric.widthPixels + distance) * 9 / 16;
                        img_mine_background.setLayoutParams(lp);
                        return true; // 返回true表示已經(jīng)完成觸摸事件啊鸭,不再處理
                }
                return false;
            }
        });

    }

    private void replyImage() {
        final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) img_mine_background.getLayoutParams();
        final float w = img_mine_background.getLayoutParams().width;// 圖片當(dāng)前寬度
        final float h = img_mine_background.getLayoutParams().height;// 圖片當(dāng)前高度
        final float newW = metric.widthPixels;// 圖片原寬度
        final float newH = metric.widthPixels * 9 / 16;// 圖片原高度

        // 設(shè)置動(dòng)畫
        ValueAnimator anim = ObjectAnimator.ofFloat(0.0F, 1.0F).setDuration(200);

        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float cVal = (Float) animation.getAnimatedValue();
                lp.width = (int) (w - (w - newW) * cVal);
                lp.height = (int) (h - (h - newH) * cVal);
                img_mine_background.setLayoutParams(lp);
            }
        });
        anim.start();

    }


}

recyclerview 的adapter:

package com.example.sunxiaokun.status;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.example.sunxiaokun.testcoordinatorlayout.R;

/**
 * Created by sunxiaokun on 2016/8/24.
 */
public class TransAdapter extends RecyclerView.Adapter<TransAdapter.ViewHolder> {
    private static final int IS_HEADER = 0;
    private static final int IS_NORMAL = 1;
    private Context mContext;
    private OnTouchClick mOnTouchClick;

    public void setOnTouchClick(OnTouchClick onTouchClick) {
        mOnTouchClick = onTouchClick;
    }


    public TransAdapter(Context context){
       this.mContext = context;
    }

    @Override
    public int getItemViewType(int position) {
        return  position == 0 ? IS_HEADER : IS_NORMAL;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ViewHolder viewHolder = null;
        switch (viewType){
            case IS_HEADER:
                View view = View.inflate(mContext, R.layout.item_iv,null);
                viewHolder = new ViewHolder(view);
                viewHolder.trans_iv = (ImageView) view.findViewById(R.id.trans_iv_item);
                break;
            case IS_NORMAL:
                View view1 = View.inflate(mContext, R.layout.item_anim,null);
                viewHolder = new ViewHolder(view1);
                viewHolder.iv_anim = (ImageView) view1.findViewById(R.id.iv_anim);
                break;
        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        if(position == 0){
            mOnTouchClick.onTouch(holder.trans_iv);
        }
    }

    @Override
    public int getItemCount() {
        return 30;
    }

    class ViewHolder extends RecyclerView.ViewHolder{
        private ImageView iv_anim;
        public ImageView trans_iv;
        public ViewHolder(View itemView) {
            super(itemView);
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锹淌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赠制,更是在濱河造成了極大的恐慌赂摆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钟些,死亡現(xiàn)場離奇詭異烟号,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)政恍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門汪拥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篙耗,你說我怎么就攤上這事迫筑。” “怎么了宗弯?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵脯燃,是天一觀的道長。 經(jīng)常有香客問我蒙保,道長辕棚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮逝嚎,結(jié)果婚禮上扁瓢,老公的妹妹穿的比我還像新娘。我一直安慰自己懈糯,他們只是感情好涤妒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赚哗,像睡著了一般她紫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屿储,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天贿讹,我揣著相機(jī)與錄音,去河邊找鬼够掠。 笑死民褂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疯潭。 我是一名探鬼主播赊堪,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼竖哩!你這毒婦竟也來了哭廉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤相叁,失蹤者是張志新(化名)和其女友劉穎遵绰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體增淹,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椿访,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虑润。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片成玫。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拳喻,靈堂內(nèi)的尸體忽然破棺而出哭当,到底是詐尸還是另有隱情,我是刑警寧澤舞蔽,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布荣病,位于F島的核電站,受9級(jí)特大地震影響渗柿,放射性物質(zhì)發(fā)生泄漏个盆。R本人自食惡果不足惜脖岛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颊亮。 院中可真熱鬧柴梆,春花似錦、人聲如沸终惑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雹有。三九已至偿渡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霸奕,已是汗流浹背溜宽。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留质帅,地道東北人适揉。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像煤惩,于是被迫代替她去往敵國和親嫉嘀。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,749評論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,727評論 22 665
  • 2013.1.25 我以為魄揉,不曾開始就一直不會(huì)開始剪侮。 我睡眠不好,見知乎上有人問什猖,為什么有些牛人可以每天睡三四個(gè)小...
    章小白同學(xué)閱讀 209評論 0 1
  • 朋友圈看到一則知乎分享不狮,題目是《摧毀一個(gè)熊孩子有多困難》。無盡的長度在旱,往下展開全文了好多次都沒到底摇零。 里面貢獻(xiàn)了無...
    白露Lin閱讀 473評論 0 0
  • 桌上放有兩個(gè)大小相同的類似水盆的容器和六七塊大小不一的石頭。其中一個(gè)容器中盛有一 大半的細(xì)沙桶蝎,另一個(gè)容器是空的∽そ觯現(xiàn)...
    橞在祺中閱讀 828評論 0 0