广告指示器滑动效果

这段代码用的是ViewPager+自定义控件技术实现的广告指示器滑动效果

先展示下主要代码以及效果 后面会附上源代码的

BannerFragment.java

package com.example.ex_templete;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class BannerFragment extends Fragment
{
    private static final int COUNT_BANNER = 100000;
    private ViewPager mPager;
    // 定义广告图片
    private int[] mDrawerRes = new int[]
    { R.drawable.banner01, R.drawable.banner02, R.drawable.banner03,
            R.drawable.banner04, R.drawable.banner05 };
    // 保存当前ViewPager手动滑动状态
    private BannerIndicater mIndicater;
    class BannerAdapter extends FragmentPagerAdapter
    {
        public BannerAdapter(FragmentManager fm)
        {// FragmentPagerAdapter要求传入一个FragmentManager的对象
            super(fm);
        }
        @Override
        public Fragment getItem(int position)
        {// 将mDrawerRes集合中的五张图片加入到FragmentPagerAdapter中
            ImageFragment fragment = new ImageFragment();
            int index = position % mDrawerRes.length;
            fragment.changeImg(mDrawerRes[index], index);
            return fragment;
        }
        @Override
        public int getCount()
        {
            return COUNT_BANNER;//当前有100000张pager页面模拟无尽模式
        }
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
        View layout = inflater.inflate(R.layout.fragment_banner, container,
                false);
        initViewPager(layout);// 初始化ViewPager(广告)
        initIndicater(layout);// 初始化指示器(可以滚动的圆点)
        return layout;
    }
    private void initIndicater(View layout)
    {//BannerIndicater是自定义控件
        mIndicater = (BannerIndicater) layout.findViewById(R.id.indicater);
    }

    private void initViewPager(View layout)
    {
        mPager = (ViewPager) layout.findViewById(R.id.pager);
        FragmentManager fm = getChildFragmentManager();
        mPager.setAdapter(new BannerAdapter(fm));
        mPager.setOnPageChangeListener(new BannerPagerChangeListener());
        // 从第50000张pager开始 就可以左右都能滑动了,给用户的感觉是无尽的
        mPager.setCurrentItem(COUNT_BANNER / 2);
    }
    class BannerPagerChangeListener implements OnPageChangeListener
    {
        @Override
        public void onPageScrollStateChanged(int state)
        {
            switch (state)
            {
                case ViewPager.SCROLL_STATE_IDLE:
                    Log.e("PagerChange", "ScrollState : arg0" + "空闲");
                    break;
                case ViewPager.SCROLL_STATE_DRAGGING:
                    Log.e("PagerChange", "ScrollState : arg0" + "拖拽");
                    break;
                case ViewPager.SCROLL_STATE_SETTLING:
                    Log.e("PagerChange", "ScrollState : arg0" + "固定");
                    break;
                default:
                    break;
            }
        }
        @Override
        public void onPageScrolled(int persion, float positionOffset,
                int positionOffsetPixels)
        {
            Log.e("PagerChange", "Scrolled : 滑动百分比" + positionOffset
                    + " 滑动像素: " + positionOffsetPixels);
            mIndicater.changeFrontPlace(persion, positionOffset);
        }
        @Override
        public void onPageSelected(int postion)
        {
            Log.e("PagerChange", "Selected : postion" + postion);
            // changeInidcatorImg(postion % mImgIndicatorIDs.length);
        }
    }

}

BannerIndicater.java

package com.example.ex_templete;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.ImageView;
public class BannerIndicater extends ImageView
{
    private static final int R = 5;
    private static final int Y = 32;
    private static final int X = 20;
    private static final int POINT_DISTENCE = R*3;
    private float mFrontX = X;
    private float mFrontY = Y;
    private Paint mBgPaint;
    private Paint mFrontPaint;

    private float persionOffset;
    private int persion;
    public BannerIndicater(Context context){
        super(context);
        //如果只重写这个方法 那么这个自定义控件只能在setViewContent(new BannerIndicater());
    }

    public BannerIndicater(Context context, AttributeSet attrs)
    {//自定义控件必须有一个 有参的构造方法,如果想在layout.xml文件中直接写入的话就要重写这个方法
        super(context, attrs);
        initPaint();
    }
    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
        for (int i = 0; i < 5; i++)
        {
            canvas.drawCircle(X + i * POINT_DISTENCE, Y, R, mBgPaint);
        }

        canvas.drawCircle(mFrontX+ (persion+persionOffset)*POINT_DISTENCE, mFrontY, R, mFrontPaint);
    }

    public void changeFrontPlace(int persion,float persionOffset)
    {
        this.persionOffset = persionOffset;
        this.persion = persion % 5;
    }
    private void initPaint()
    {
        mFrontPaint = new Paint();
        mFrontPaint.setColor(Color.RED);
        mBgPaint = new Paint();
        mBgPaint.setColor(Color.YELLOW);
        mBgPaint.setAntiAlias(true);
        mBgPaint.setStyle(Paint.Style.STROKE);
        mBgPaint.setStrokeWidth(2);
    }
}

fragment_banner.xml

<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"
    tools:context=".BannerFragment" >
    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:background="#C0C0C0" >
    </android.support.v4.view.ViewPager>

    <!-- 在布局中使用自定义控件 -->
    <com.example.ex_templete.BannerIndicater
        android:id="@+id/indicater"
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:layout_alignBottom="@+id/pager"
        android:layout_alignParentRight="true"
        android:background="#80000000" />
</RelativeLayout>

滑动效果图:

点击事件:

源代码:额 sorry 源代码压缩包 正在上传网盘,速度有点慢 稍后附上

广告指示器滑动效果

时间: 2024-08-03 13:28:15

广告指示器滑动效果的相关文章

unity3d实现广告滑动效果

新建了一个带mask的prefab,加上代码只需要将图片prefab.按钮prefab和所想添加的图片 拖进去会自动生成按钮,滑动速度可以随意调time,滑动效果用itween实现的,所以需要加上itween插件 效果如下:(图片是我最爱的马路小天使(ˉ﹃ˉ)) 附上代码 1 using UnityEngine; 2 using System.Collections.Generic; 3 using UnityEngine.UI; 4 5 public class Mask : MonoBeha

实现ViewPager多页面滑动效果

 viewPager实现引导页 ViewPager多页面滑动效果 1.Android的左右滑动在实际编程经常能用到,比如查看多张图片,左右 切换tab页. 2.自android 3.0之后的SDK中提供了android-support-V4包用以实现 版本兼容,让老版本系统下的应用通过加入jar包实现扩展,其中有一 个可以实现左右滑动的类ViewPager 今天我们就用ViewPager类来实现引导页的实战案例 实现功能: 1.实现ViewPager多页面滑动效果. 2.下方的显示当前焦点页

android UI之ViewPager多页面滑动效果

  viewPager实现引导页 ViewPager多页面滑动效果 1.Android的左右滑动在实际编程经常能用到,比如查看多张图片,左右 切换tab页. 2.自android 3.0之后的SDK中提供了android-support-V4包用以实现 版本兼容,让老版本系统下的应用通过加入jar包实现扩展,其中有一 个可以实现左右滑动的类ViewPager 今天我们就用ViewPager类来实现引导页的实战案例 实现功能: 1.实现ViewPager多页面滑动效果. 2.下方的显示当前

Android第六期 - ViewPage与菜单栏本地页面监听滑动效果

首先是JiaoyuzixunActivity.java代码部分: package com.gaoxiaotong.ctone.jiaoyuzixun; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.json.JSONArray; import org.json.JSONO

Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScr

UI--单行文本水平触摸滑动效果

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45115047 [导航] - 单行文本水平触摸滑动效果 通过EditText实现TextView单行长文本水平滑动效果 - 多行文本折叠展开 自定义布局View实现多行文本折叠和展开 1.初衷 最近做应用的时候有用到TextView单行长文本,当文本内容过长时候又想实现触摸水平滑动效果.网上找了很多

android仿系统Launcher界面,实现分屏,左右滑动效果(ViewSwitcher)

ViewSwitcher代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitcher 支持指定动画效果. 为了给ViewSwitcher 添加多个组件, 一般通过ViewSwitcher 的setFactory 方法为止设置ViewFactory ,并由ViewFactory为之创建View 即可. 下面通过一个实例来介绍 ViewSwitcher的用法.(仿Android系统L

Android用TabLayout实现类似网易选项卡动态滑动效果

此前我们用HorizontalScrollView也实现了类似网易选项卡动态滑动效果,详见 Android选项卡动态滑动效果这篇文章 这里我们用TabLayout来实现这一效果.TabLayout是Android Design Support Library库中的控件. Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给

十六、Android 滑动效果汇总

Android 滑动效果入门篇(一)-- ViewFlipper Android 滑动效果入门篇(二)-- Gallery Android 滑动效果基础篇(三)-- Gallery仿图像集浏览 Android 滑动效果基础篇(四)-- Gallery + GridView Android 滑动效果进阶篇(五)-- 3D旋转 Android 滑动效果进阶篇(六)-- 倒影效果 ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,