仿知乎广告效果

栏目: IOS · Android · 发布时间: 6年前

内容简介:仿知乎广告的效果,先看效果图效果如下:

仿知乎广告的效果,先看效果图

仿知乎广告效果

效果如下:

向上滑动,图片的头部先出来,然后随着滚动,也一起滚动,到图片滑出屏幕时候,图片内部也到达底部。

向下滑动,图片的底部先出来,然后随着滚动,也一起滚动,到图片滑出屏幕时候,图片内部也到达头部。

所以有几个要点

1, 图片内部肯定是使用canvas.translate

2,图片随着list滑动而滑动

3, 图片要设置属性 android:scaleType=”matrix”

第一步:所以先自定义一个ImageView,根据list传进来的距离来translate

public class ZhiHuImageView extends AppCompatImageView {

     /**
     * 测量的实际最小高度
     */
    private int mMinDx;
    /**
     * 移动的距离
     */
    private int mDx;

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

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mMinDx = h;
    }

    /**
     * 暴露给外界来设置移动距离的
     * @param dx  滑动的距离
     */
    public void setDy(int dx){
        /**
         * 拿到图片的Drawable,判空处理
         */
        if(getDrawable() == null){
            return;
        }
        //需要移动的距离
        mDx = dx - mMinDx;

        //滑动距离 必须大于0
        if (mDx <= 0) {
            mDx = 0;
        }
        //图片滑动最大距离  =  图片实际高度   -   显示的最小高度(xml布局中设置的高度)
        if (mDx > getDrawable().getBounds().height() - mMinDx) {
            mDx = getDrawable().getBounds().height() - mMinDx;
        }

        //每次算好距离开始重绘
        invalidate();
    }

    public int getDx(){
        return mDx;
    }

    @Override
    protected void onDraw(Canvas canvas) {

        Drawable drawable = getDrawable();
        if(drawable == null){
            Log.e("Tag","NULL=drawable");
            return;
        }
        int w = getWidth();
        /**
         * 高度  = (宽度/实际宽度)*实际高度
         * 因为宽度是match的,getIntrinsicWidth()获得是固有宽度
         */
        int h = (int) (getWidth() * 1.0f / drawable.getIntrinsicWidth() * drawable.getIntrinsicHeight());
        drawable.setBounds(0, 0, w, h);
        Log.e("Tag","h="+h);
        Log.e("Tag","getIntrinsicHeight="+drawable.getIntrinsicHeight());
        Log.e("Tag","getDx="+mDx);
        //锁画布
        canvas.save();
        //画布原点移动到新的坐标
        canvas.translate(0, -getDx());
        super.onDraw(canvas);
        canvas.restore();
    }
}

第二步:list传递滑动距离传递

适配器adapter用的是BaseQuickAdapter:

<code>    //代码省略
    if (position > 0 && position % 4 == 0) {
            //每隔4个显示
            helper.setVisible(R.id.ll_item, false);
            helper.setVisible(R.id.zh_img, true);
            String url ="http://imgstore04.cdn.sogou.com/app/a/100520024/877e990117d6a7ebc68f46c5e76fc47a";
            String url1 ="https://raw.githubusercontent.com/hongyangAndroid/demo_rvadimage/master/rvimageads/src/main/res/mipmap-xxhdpi/gril.jpg";
            zhiHuImageView = helper.getView(R.id.zh_img);
            Glide.with(mContext)
                    .load(url)
                    .into(zhiHuImageView);
        } else {
            helper.setVisible(R.id.ll_item, true);
            helper.setVisible(R.id.zh_img, false);
        }
      //代码省略</code>
<code>核心方法addOnScrollListener,
</code>
<code> mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                        super.onScrolled(recyclerView, dx, dy);
                        //第一个可见item
                        int fPos = linearLayoutManager.findFirstVisibleItemPosition();
                        //最后个可见item
                        int lPos = linearLayoutManager.findLastCompletelyVisibleItemPosition();
                        for (int i = fPos; i <= lPos; i++) {
                            //从可见的item找到显示的图片的item
                            View view = linearLayoutManager.findViewByPosition(i);
                            ZhiHuImageView adImageView = (ZhiHuImageView) view.findViewById(R.id.zh_img);
                            if (adImageView.getVisibility() == View.VISIBLE) {
                                adImageView.setDy(linearLayoutManager.getHeight() - view.getTop());
                                Log.e("Tag","linearLayoutManager.getHeight()=="+linearLayoutManager.getHeight());
                                Log.e("Tag","view.getTop()=="+view.getTop());
                            }
                        }
                    }
                });</code>

第三步:item的布局

android:scaleType=”matrix” 设置图片显示方式为左上原点绘制显示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:fresco="http://schemas.android.com/apk/res-auto"
              android:id="@+id/ll_one_item"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:background="@drawable/ripple_one_item_bg"
              android:orientation="vertical"
              android:paddingLeft="5dp"
              android:paddingTop="5dp">
    <com.hu.test.wight.ZhiHuImageView
        android:id="@+id/zh_img"
        android:scaleType="matrix"
        android:visibility="gone"
        android:src="@mipmap/grsm"
        android:layout_width="match_parent"
        android:layout_height="200dp"/>
    <LinearLayout
        android:id="@+id/ll_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/iv_one_photo"
            android:layout_width="100dp"
            android:layout_height="132dp"
            android:layout_marginRight="12dp"
            android:background="#f2f4f5"
            android:scaleType="fitXY"
            android:transitionName="@string/transition_movie_img"
            fresco:placeholderImage="@mipmap/load"
            />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginRight="12dp"
            android:orientation="vertical">

            <!--电影名-->
            <TextView
                android:id="@+id/tv_one_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:gravity="center"
                android:maxLines="1"
                android:textColor="#ff333333"
                android:textSize="17sp"
                android:textStyle="bold"/>

            <!--导演-->
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="2dp"
                android:layout_marginTop="2dp"
                android:orientation="horizontal">

                <LinearLayout
                    android:layout_width="43dp"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="导演:"/>

                    <View
                        android:layout_width="28dp"
                        android:layout_height="2dp"
                        android:layout_marginTop="2dp"
                        android:background="@color/colorPrimary"/>

                </LinearLayout>

                <TextView
                    android:id="@+id/tv_one_directors"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:maxLines="1"
                    />
            </LinearLayout>

            <!--主演-->

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="主演:"/>

                <TextView
                    android:id="@+id/tv_one_casts"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:maxLines="2"
                    />

            </LinearLayout>

            <TextView
                android:id="@+id/tv_one_genres"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="2dp"
                android:layout_marginTop="2dp"
                android:ellipsize="end"
                android:maxLines="1"
                />

            <TextView
                android:id="@+id/tv_one_rating_rate"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:maxLines="1"
                />
        </LinearLayout>

    </LinearLayout>

    <View
        android:id="@+id/view_color"
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:layout_marginLeft="112dp"
        android:layout_marginTop="5dp"/>
</LinearLayout>

基本就完成了知乎广告的效果了


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

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UCD火花集

UCD火花集

UCDChina / 人民邮电出版社 / 2009 / 25.00元

本书收集了UCDChina上线以来推出的13个话题,内容涵盖了产品设计的全部流程,按顺序集结到第一到第十三章中,讨论了如何研究用户、如何将用户需求应用到产品设计中、如何传达和协作。在第十四章,几位设计师分享了生活中的UE故事。第十五章,列举了一些实例和实践者的观点。本书适合有一定工作经验,从事产品设计、产品策划、交互设计、视觉设计、用户研究、前端开发、网站运营,以及所有与互联网有关的从业人员阅读。一起来看看 《UCD火花集》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换