卡片切换

本文介绍了如何在底部导航中实现四个页面间的卡片切换效果,详细解析了相关实现细节和步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//在这里有一个底部导航四个页面,现在只显示卡片切换页面

compile 'com.google.code.gson:gson:2.8.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit2:retrofit:2.0.1'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.squareup.okio:okio:1.13.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
compile 'com.hjm:BottomTabBar:1.1.1'
compile 'com.facebook.fresco:fresco:1.5.0'
compile 'com.xhb:xbanner:1.3.0'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'jp.wasabeef:glide-transformations:1.0.6'
compile 'org.greenrobot:eventbus:3.1.1'
compile 'org.xutils:xutils:3.5.0'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'


<android.support.v4.view.ViewPager
    android:layout_marginTop="20dp"
    android:id="@+id/viewpager"
    android:layout_width="450dp"
    android:layout_height="580dp"
    android:layout_gravity="center_horizontal"
    android:background="@drawable/card_bg_def"
    ></android.support.v4.view.ViewPager>

<Button
    android:id="@+id/buton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="40dp"
    android:text="换一批"
    android:textColor="#f2ecec"
    android:background="#1c641f"
    />

<TextView
    android:id="@+id/tv_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal" />

<ImageView
    android:id="@+id/img"
    android:layout_width="340dp"
    android:layout_height="400dp"
    android:layout_gravity="center_horizontal" />

<TextView
    android:layout_marginTop="15dp"
    android:id="@+id/tv_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

//api包下的两个API类
public class Api {
    public static final String URL = "http://api.svipmovie.com/front/";
    public static final String catalogId = "402834815584e463015584e539330016";
}

public interface ApiService {
    @POST
    Observable<MyBean> getDates(@Url String url, @QueryMap Map<String,String> map);

}

//APP
import android.app.Application;
import android.graphics.Bitmap;

import com.bawei.lianxi20171209.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;




public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        initImageLoder();
    }

    /**
     * 图片加载
     */
    private void initImageLoder() {
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                //.displayer(new RoundedBitmapDisplayer(360))//圆角问题:必须在xml里面指定具体大小
                //设置下载的图片是否缓存在SD卡中
                .cacheOnDisk(true)
                //设置下载的图片是否缓存在内存中
                .cacheInMemory(true)
                //设置图片的解码类型
                .bitmapConfig(Bitmap.Config.ARGB_8888)
                //设置图片Uri为空或是错误的时候显示的图片
                .showImageForEmptyUri(R.mipmap.ic_launcher)
                //设置图片加载/解码过程中错误时候显示的图片
                .showImageOnFail(R.mipmap.ic_launcher)
                //设置图片在下载期间显示的图片
                .showImageOnLoading(R.mipmap.ic_launcher)
                //图像将被二次采样的整数倍
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                //设置图片加入缓存前,对bitmap进行设置
                // .preProcessor(BitmapProcessor  preProcessor)
                //设置图片在下载前是否重置,复位
                .resetViewBeforeLoading(true)
                //是否设置为圆角,弧度是多少
                .displayer(new RoundedBitmapDisplayer(20))
                //是否图片加载好后渐入的动画时间
                .displayer(new FadeInBitmapDisplayer(100))
                //构建完成
                .build();
        ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
                .defaultDisplayImageOptions(options)
                .build();

        ImageLoader.getInstance().init(configuration);
    }
}
 //model包下三个类

public interface Imodel {
    void RequestSuccess(String url, String catalogId, int pnum, Onclick onclick);
}

public class model implements Imodel{

    private ApiService apiService;
    private Observable<MyBean> dates;

    @Override
    public void RequestSuccess(String url, String catalogId, int pnum, final Onclick onclick) {

        final Map<String, String> map = new HashMap<>();
        map.put("catalogId", catalogId);
        map.put("pnum", pnum + "");

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        apiService = retrofit.create(ApiService.class);
        dates = apiService.getDates("columns/getVideoList.do", map);
        dates.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<MyBean>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(MyBean bean) {
                        List<MyBean.RetBean.ListBean> list = bean.getRet().getList();
                        onclick.dataSuccess(list);
                    }
                });


    }
}

public interface Onclick {
    void dataSuccess(List<MyBean.RetBean.ListBean> list);
}
//persenter包
public class Persenter {
    Imodel imodel;
    Iview iview;

    public Persenter(Iview iview) {
        this.iview = iview;
        imodel = new model();
    }

    public void getOk(String url, String catalogId, int pnum) {
        imodel.RequestSuccess(url, catalogId, pnum, new Onclick() {
            @Override
            public void dataSuccess(List<MyBean.RetBean.ListBean> list) {
                iview.showSuccess(list);
            }
        });


    }

}

//view包
public interface Iview {

    void showSuccess(List<MyBean.RetBean.ListBean> list);
}

public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.85f;
    private static final float MIN_ALPHA = 0.5f;

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();
        int pageHeight = view.getHeight();

        if (position < -1) { // [-Infinity,-1) 不可见状态
            // This page is way off-screen to the left.
            view.setAlpha(0); //透明度设置为0

        } else if (position <= 1) { // [-1,1] 可见状态,设置动画效果
            // Modify the default slide transition to shrink the page as well
            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
            float vertMargin = pageHeight * (1 - scaleFactor) / 2;
            float horzMargin = pageWidth * (1 - scaleFactor) / 2;
            if (position < 0) {
                view.setTranslationX(horzMargin - vertMargin / 2);
            } else {
                view.setTranslationX(-horzMargin + vertMargin / 2);
            }

            // Scale the page down (between MIN_SCALE and 1)
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);

            // Fade the page relative to its size.
            view.setAlpha(MIN_ALPHA +
                    (scaleFactor - MIN_SCALE) /
                            (1 - MIN_SCALE) * (1 - MIN_ALPHA));

        } else { // (1,+Infinity] 不可见状态
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }
}

//主页面
public class ZixuanFragment extends Fragment implements Iview{
    private ViewPager viewPager;
    private Button button;
    private Persenter presenter;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=View.inflate(getContext(), R.layout.home_item,null);
        viewPager = (ViewPager)view.findViewById(R.id.viewpager);
        button = (Button) view.findViewById(R.id.buton);
        presenter = new Persenter(this);
        presenter.getOk(Api.URL, Api.catalogId, 1);
        viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
           button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        presenter.getOk(Api.URL, Api.catalogId, getpage());
    }
});

        return  view;
    }

    @Override
    public void showSuccess(final List<MyBean.RetBean.ListBean> list) {
        viewPager.setAdapter(new PagerAdapter() {
            @Override
            public int getCount() {
                return list.size();
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                MyBean.RetBean.ListBean lb = list.get(position);
                View v = View.inflate(getActivity(), R.layout.item, null);
                ImageView img = (ImageView) v.findViewById(R.id.img);
                TextView title = (TextView) v.findViewById(R.id.tv_title);
                TextView tvt = (TextView) v.findViewById(R.id.tv_text);
                title.setText(lb.getTitle());
                tvt.setText(lb.getDescription());
                ImageLoader.getInstance().displayImage(lb.getPic(), img);
                container.addView(v);
                return v;
            }

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


        });

    }

    private int getpage() {
        int max = 108;
        int min = 1;
        Random random = new Random();

        int s = random.nextInt(max) % (max - min + 1) + min;
        return s;
    }
}

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值