Android 仿土巴兔选择效果

1,前两天在群里看到有人在讨论土巴兔的选择装修风格的效果,自己也想实现,果断百度一下,有些好的文章,就花了些时间来分析了下,先看看别人土巴兔原装的功能

2,可以看到,基本上可以使用一个vviewpager来实现,主要技术点一下

  ①android:clipChildren设置为false,意味着不限制子View在其范围内,也就是说子view可以超出父view的范围

  ②通过PageTransformer来实现缩放动画

  ③拦截点击事件的位置来实现点击切换viewpager

来看一下代码,首先看一下布局文件main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/page_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@android:color/white"
                android:clipChildren="false"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"
                tools:context=".MainActivity"
                tools:showIn="@layout/activity_main">

    <com.wangjitao.tubatudemo.view.ClipViewPager
        android:id="@+id/viewPager"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerInParent="true"
        android:clipChildren="false"
        android:overScrollMode="never" />

</RelativeLayout>

 其中ClipViewPager是一个自定义的viewpager,主要实现了两个功能,一,判断用户点击事件在不在Viewpager中,二,若在,则设置当前页为其

   ClipViewPager.java

package com.wangjitao.tubatudemo.view;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by wangjitao on 2016/4/15.
 */
public class ClipViewPager extends ViewPager{
    public ClipViewPager(Context context) {
        super(context);
    }

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

    /**
     * 重写点击事件,当用户抬起的时候 判断用户点击的区域是否在viewPager的区域中
     * 如果是,在判断是在哪个子view上,然后设置当前页为该view
     * @param ev
     * @return
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_UP){
            View view = viewOfClickOnScreen(ev);
            if (view != null){
                setCurrentItem(indexOfChild(view));
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    private View viewOfClickOnScreen(MotionEvent ev) {
        int childCount = getChildCount();
        int[] location = new int[2];
        for (int i = 0; i < childCount; i++) {
            View v = getChildAt(i);
            v.getLocationOnScreen(location);
            int minX = location[0];
            int minY = getTop();

            int maxX = location[0] + v.getWidth();
            int maxY = getBottom();

            float x = ev.getX();
            float y = ev.getY();

            if ((x > minX && x < maxX) && (y > minY && y < maxY)) {
                return v;
            }
        }
        return null;
    }
}

三,编写自定义的PageTransformer ,来实现当前页切换下一页的控件的缩放问题

ScalePageTransformer.java
package com.wangjitao.tubatudemo.view;

import android.os.Build;
import android.support.v4.view.ViewPager;
import android.view.View;

/**
 * Created by wangjitao on 2016/4/15.
 */
public class ScalePageTransformer implements ViewPager.PageTransformer {

    public static final float MAX_SCALE = 1.2f ;
    public static final float MIN_SCALE = 0.6f ;

    /**
     * 当处于最中间的view往左边滑动时,它的position值是小于0的,并且是越来越小,它右边的view的position是从1逐渐减小到0的。
     * @param page
     * @param position
     */
    @Override
    public void transformPage(View page, float position) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            page.getParent().requestLayout();
        }
        if (position < -1) {
            position = -1;
        } else if (position > 1) {
            position = 1;
        }

        float tempScale = position < 0 ? 1 + position : 1 - position;

        float slope = (MAX_SCALE - MIN_SCALE) / 1;
        float scaleValue = MIN_SCALE + tempScale * slope;
        page.setScaleX(scaleValue);
        page.setScaleY(scaleValue);
    }
}

 基本上就可以实现了,再贴一下是MainActivity.java和ViewPager的Adapter

 MainActivity.java

package com.wangjitao.tubatudemo;

import android.content.Context;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MotionEvent;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.RelativeLayout;

import com.wangjitao.tubatudemo.adapter.ClipPagerAdapter;
import com.wangjitao.tubatudemo.view.ClipViewPager;
import com.wangjitao.tubatudemo.view.ScalePageTransformer;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private Context mContext = MainActivity.this ;
    private ClipViewPager mViewPager ;
    private ClipPagerAdapter mClipViewPager ;
    private List<Integer> mData ;
    private RelativeLayout mRelativeLayout ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Hi Girl", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        initView();
        initData();
    }

    private void initView() {
        mViewPager = (ClipViewPager) findViewById(R.id.viewPager) ;

        mViewPager.setPageTransformer(true, new ScalePageTransformer());
        mRelativeLayout = (RelativeLayout) findViewById(R.id.page_container);

        //需要将整个页面的事件分发给ViewPager,不然的话只有ViewPager中间的view能滑动,其他的都不能滑动,这是肯定的,
        //因为ViewPager总体布局就是中间那一块大小,其他的子布局都跑到ViewPager外面来了
        mRelativeLayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return mViewPager.dispatchTouchEvent(event);
            }
        });

        mData = new ArrayList<>();
        mClipViewPager = new ClipPagerAdapter(mData,mContext);
        mViewPager.setAdapter(mClipViewPager);
    }

    private void initData() {
        mData.add(R.mipmap.style_xiandai);
        mData.add(R.mipmap.style_jianyue);
        mData.add(R.mipmap.style_oushi);
        mData.add(R.mipmap.style_zhongshi);
        mData.add(R.mipmap.style_meishi);
        mData.add(R.mipmap.style_dzh);
        mData.add(R.mipmap.style_dny);
        mData.add(R.mipmap.style_rishi);

        mViewPager.setOffscreenPageLimit(mData.size());
        mClipViewPager.notifyDataSetChanged();
    }


}

  ViewPager的适配器 ClipPagerAdapter.java

package com.wangjitao.tubatudemo.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.List;

/**
 * Created by jh on 2016/4/15.
 */
public class ClipPagerAdapter extends RecyclingPagerAdapter {
    private List<Integer> mData ;
    private Context mContext ;

    public ClipPagerAdapter(List<Integer> mData ,Context mContext ) {
        this.mData = mData ;
        this.mContext = mContext ;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup container) {
        ImageView imageView = null ;
        if (convertView == null){
            imageView = new ImageView(mContext);
        }else {
            imageView = (ImageView) convertView ;
        }
        imageView.setTag(position);
        imageView.setImageResource(mData.get(position));
        return imageView;
    }

    @Override
    public int getCount() {
        return mData.size();
    }
}

  ok ,基本上就完成了 ,看一看效果

    

 

  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
绝对好用的PHP源码。亲测可以使用 1、解压安装程序包 2、FTP以二进制的方式上传 3、访问安装脚本 在您的浏览器输入你的网址 http://您的域名/ 第一次访问会自动跳转到暗转页面的。没有的话,可以使用http://您的域名/install 这里要注意查看下你的 system/config.php 文件是否有可写入权限如果没有可能导致安装失败 4、检测安装环境 图中圈出的信息表示你的网站要支持的组件和相应目录所要具有的权限 如有不支持组件请及时配置环境支持 如目录权限不对请及时修改目录权限 5、填写安装信息 根据图示填写你的相应的信息 安装完成 安装过程可能会出现的情况 如果安装提示成功了,但访问网站提示500错误,那么可能是由于网站目录权限有问题,应添加everyone等权限哦。 6、安装过程可能会出现的错误 ①上传后浏览器输入网址没的跳转到安装界面提示 Zend Optimizer not installed 表示没有安装Zend Optimize组建 ②上传后浏览器输入网址 面页空白 由于你的服务器屏蔽的错误信息所以有两种可能 1.文件没有二进制上传 2.你的PHP版本可能是PHP5.3 如果查看自己的PHP版本,可以百度搜索。 ③提示安装成功后不能访问网站 打开网站去显示网页500错误或显示服务器内部错误, 很有可能你的system/config.php文件没有写入权限,在安装的第3步有提到 6、网站基本配置。 【针对很多用户在论坛下载模板以后不知道如何安装使用,在此把模板的安装使用方法给贴出来,希望广大用户可以对着操作】 1、先把模板上传到网站 themes 目录下,切记不是传到 default 目录,是和 default 目录同级。即使你上传了新模板。也不可删除 default,所有的模板都是基于 default 之上才能显示的。,如果红色框出的是上传的两个模板目录。 2、上传后,在网站后台,网站设置-->界面设置-->模板设置 找到你新添加的模板安装上。如图 3、由于模板是和城市绑定的。所以你要把某个城市的模板设置成你刚安装的模板需 设置-->城市管理-->编辑 你的城市,选择模板。 【家居,婚庆,装企系统导航修改方法】 更改导航是用户在修改网站的时候经常能遇见的,许多用户不知道如何修改,家居系统导航修改方法,希望大家参考: 1、家居门户系统 首先找到导航部分存在哪个文件当中,路径为:\themes\default\block\header.html 自己找到对应位置,编辑代码即可! 【网站底部帮助中心竖列表怎么填充?】 网站底部帮助中心里面可以填充关于我们,消费指南,法律声明等介绍信息,怎么在后台中配置这样的帮助中心数列表呢? 方法:1、点击 ”运营“ --> ”文章管理“ --> ”分类列表,找到网站帮助分类,点击 ”添加子分类“ 2、点击 ”运营“ --> ”帮助中心“ --> ”帮助管理“ --> ”添加“ 3、添加帮助 【推荐位的管理和调用方法】 如何在网站中使用推荐位和广告位 推荐位和广告位:推荐位是对站内内容的手工推送,对指定位置显示的内容以及内容显示顺序的精确控制;广告位的作用域推荐位基本相同,但是广告内容可以自己定义。 提示:对于广告位和推荐位来说,只要在后台创建了,就可以在模板调用,不论是否制定了所属模板或者所属页面,所属模板和所属页面仅仅是为了方便管理设置的,不设置对调用也没有人任何影响。 一、推荐位管理 1、推荐位的管理路径和菜单 1)操作路径 后台-->运营-->内容推荐 2)菜单说明 推荐页面:推荐位所在页面,在创建推荐位时可以选择,但对实际推荐位置没有影响,当推荐位比较多时,可以通过推荐页面进行归集管理。 推荐位列表:推荐位的创建、修改、删除和内容管理都在这里进行。 内容列表:所有推荐位内容的列表,可以通过搜索输出你想要的数据,然后再进行批量操作。例如要删除合肥市的所有推荐数据,可以在搜索对话框的城市条件选择合肥,然后搜索,输出的记过全选后选择批量删除即可。 2、推荐位的创建 1)操作路径 后台-->运营-->内容推荐-->推荐位列表-->添加 2)创建界面 3)选项说明 推荐位:这是推荐位的名称,在调用的时候需要指定,所以请使用意义明确的命名方式,例如“首页2F装修公司推荐位”。 页面:属于哪个页面的推荐,可以根据页面在推荐位列表中进行筛选,推荐位较多时比较实用。 类型:要推荐内容的类型,家居系统中有会员、设计师

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值