Android——ViewPager滑动背景渐变(自定义view,ViewPager)

效果:

ActivityBackgroundImage,java(自定义视图)
package com.example.chenshuai.test322;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import java.util.List;

/**
 * Created by chenshuai on 2016/4/22.
 */
public class ActivityBackgroundImage extends View {

    private int mPosition;
    private float mDegree;
    private List<Drawable> mDrawableLists;
    private int mPrePosition = 0;
    private Drawable mNext;

    //自己写的方法 生成set方法
    //设置背景图片的drawble
    public void setmDrawableLists(List<Drawable> mDrawableLists) {

        this.mDrawableLists = mDrawableLists;

        mNext = mDrawableLists.get(1);//设置下一个背景图片的drawable
    }
    //设置图片位置?
    public void setmPosition(int mPosition) {

        this.mPosition = mPosition;
    }
    //设置图片
    public void setmDegree(float mDegree) {

        this.mDegree = mDegree;
    }

    //生成构造方法
    public ActivityBackgroundImage(Context context) {
        super(context);
    }

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

    public ActivityBackgroundImage(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public ActivityBackgroundImage(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    //自绘控件的意思是,这个控件上的内容是用onDraw函数绘制出来的。
    @Override
    protected void onDraw(Canvas canvas) {
        Log.i("111", "onDraw");

        //自定义属性
        if (null == mDrawableLists) {
            return;
        }

        //透明度
        int alpha1 = (int) (255 - (mDegree * 255));

        //边框
        Drawable fore = mDrawableLists.get(mPosition);
        fore.setBounds(0, 0, getWidth(), getHeight());
        mNext.setBounds(0, 0, getWidth(), getHeight());

        if (mPrePosition != mPosition) {//边界判断

            if (mPosition != mDrawableLists.size() - 1) {

                mNext = mDrawableLists.get(mPosition + 1);

            } else {

                mNext = mDrawableLists.get(mPosition);

            }

        }

        fore.setAlpha(alpha1);//淡出

        mNext.setAlpha(255);

        mNext.draw(canvas);

        fore.draw(canvas);

        mPrePosition = mPosition;
        super.onDraw(canvas);
    }
}
activity_activityhuadong.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.chenshuai.test322.Activityhuadong">

    <com.example.chenshuai.test322.ActivityBackgroundImage
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/img"/>

    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/viewpager">
    </android.support.v4.view.ViewPager>

</RelativeLayout>

vp.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">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="第几个"
        android:textSize="30sp"
        android:gravity="center"
        android:id="@+id/txt"/>

</LinearLayout>
Activityhuadong.java
package com.example.chenshuai.test322;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

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

public class Activityhuadong extends AppCompatActivity {

    private ActivityBackgroundImage mImg;
    private ViewPager mViewPager;
    private List<View> mViewLists;
    private List<Drawable> mDrawableLists;
    private static final int ALL = 5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activityhuadong);

        initViews();
        //设置图片列表? 准备数据?
        mImg.setmDrawableLists(mDrawableLists);

        //设置ViewPager适配器?
        mViewPager.setAdapter(new MyAdapter());
        //加监听
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                mImg.setmPosition(position);
                mImg.setmDegree(positionOffset);
                mImg.invalidate();
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    private void initViews()
    {
        mImg = (ActivityBackgroundImage) findViewById(R.id.img);

        mViewPager = (ViewPager) findViewById(R.id.viewpager);

        mViewLists = new ArrayList<View>();

        mDrawableLists = new ArrayList<Drawable>();

        for (int i = 0; i < ALL; i++) {

            View view = getLayoutInflater().inflate(R.layout.vp, null);

            mViewLists.add(view);

            if (i % 2 == 0) {

                mDrawableLists.add(getResources().getDrawable(R.drawable.df, null));

            } else {

                mDrawableLists.add(getResources().getDrawable(R.drawable.hh,null));

            }

        }
    }
    //用PagerAdapter
    class MyAdapter extends PagerAdapter{

        // 获取要滑动的控件的数量,在这里我们以滑动的广告栏为例,那么这里就应该是展示的广告图片的ImageView数量
        @Override
        public int getCount() {
            return mViewLists.size();
        }

        // 来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        //PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁
        //覆盖destroyItem方法
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ((ViewPager)container).removeView(mViewLists.get(position));

        }

        // 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化,
        // 我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可
        //覆盖instantiateItem方法
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View v = mViewLists.get(position);

           TextView textView = (TextView) v.findViewById(R.id.txt);

           textView.setText("第" + position + "个");

            ((ViewPager)container).addView(v);

            return v;
        }
    }
}
时间: 2024-10-12 13:12:41

Android——ViewPager滑动背景渐变(自定义view,ViewPager)的相关文章

Android -- ViewPager滑动背景渐变

原理 总布局为RelativeLayout或者FrameLayout,在这里我们用的是RelativeLayout.先设置背景图片,宽度和高度都fill_parent,在设置viewpager,viewpager的背景要透明哟~这样背景图片就可以显示在页面上.对viewpager进行滑动监听,通过滑动的偏移量对当前背景进行淡出,下一个背景进行显示. 布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/an

Android软件开发之盘点自定义View界面大合集(二)

Android软件开发之盘点自定义View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技术博客 雨松MOMO带大家盘点Android 中的自定义View界面的绘制 今天我用自己写的一个Demo 和大家详细介绍一个Android中自定义View中的使用与绘制技巧. 1.自定义view绘制字符串 相信在实际开发过程中必然很多地方都须要用到系统字 为什么会用到系统字? 方便 省内存 我相信做过J2ME游戏开发的朋友应该深知内存有多么多么重要 而且使用它还可以带来一个更重要的好处就是很方

Android中实现Bitmap在自定义View中的放大与拖动

一:基本实现思路 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对自定义View的触摸事件监听 放大与拖动 基于单点触控实现Bitmap对象在View上的拖动.并且检测View的边缘,防止拖动过界.基于两个点触控实现Bitmap对象在View上的放大.并且检测放大倍数.基于Matrix对象实现对Bitmap在View上放大与平移变换 Bitmap对象在View中的更新与显示 通过重载onDraw方法,

Android初级教程初谈自定义view自定义属性

有些时候,自己要在布局文件中重复书写大量的代码来定义一个布局.这是最基本的使用,当然要掌握:但是有些场景都去对应的布局里面写对应的属性,就显得很无力.会发现,系统自带的控件无法满足我们的要求,这个时候就要考虑自定义控件.自定义view的世界,也很浩瀚,个人需要学的地方还有很多很多.自定义view,会节省开发效率,很有必要学习其基本原理和方法.接下来就对自定义view,做一个初步的认识,一步步了解封装的重要性.但是,也仅仅是一个初步,因为它实在太灵活了. 有这么一种场景,看图: 除了布局之外,还有

Android Studio开发基础之自定义View组件

一般情况下,不直接使用View和ViewGroup类,而是使用使用其子类.例如要显示一张图片可以用View类的子类ImageView,开发自定义View组件可分为两个主要步骤: 一.创建一个继承自android.view.View类的View类,并且重写构造方法. 如下,新建一个名为MyView.Java的Java类文件,重写一个带Context的构造方法和onDraw()方法(用来重新绘制Activity窗口的背景). package com.example.lhb.contentprovid

Android学习(十七)自定义View控件 TopBar

一.创建自定义TopBar头部菜单条 实现步骤: 1.在values中添加attrs.xml文件,设置自定义属性. 2.添加Topbar类,继承RelativeLayout,实现具体功能. 3.添加到页面上,并设置添加事件. 参考代码: values\attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Top

Android:图片背景渐变切换与图层叠加的实现

本例要实现的目的: 1.图片背景渐变的切换,例如渐变的从红色切换成绿色. 2.代码中进行图层叠加,即把多个Drawable叠加在一起显示在一个组件之上. 效果图: 代码很简单: (1)布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layo

Android模仿打字机效果的自定义View实现

一.前言 在做splash界面的时候,需要做类似于打字机打字的效果,字一个一个地蹦出来,显示每一个字都带有打字的声音. 二.效果演示 本例自定义View的演示效果如下(PS:一直不知道在Android上怎么录制gif格式的动画,索性在PC上跑Genymotion Android模拟器,然后用LICEcap录屏就可以了.). 三.实现原理: 这个其实不难实现,通过一个定时器不断调用TextView的setText就行了,在setText的时候播放打字的音效.具体代码如下: import java.

android:滑动挂断自定义View的简单实现

要点: 随着手指的滑动更新位置 drawText的时候,如何计算开始的位置,使str居中 1.CallSliderEndView.java package net.mobctrl.callendview; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; impo