自定义开发一个android轮播图控件BannerImg

生成对抗网络——CGAN(代码+理解) CGAN(Conditional Generative Adversarial Network)模型是一种 深度学习模型,属于生成对抗网络(GAN)的一种 变体。它的 基本思想是通过 训练生成器和判别器两个网络,使生成器能够生成与给定条件 相匹配的 合成数据,而判别器则 负责区分真实数据和 生成数据。相比于GAN它引入了条件信息(y),使得生成器可以生成与给定条件相匹配的合成数据,从而提高了生成数据的可控性和针对性。 阅读详情

app开发中经常会用到轮播图控件,这里干脆自定义开发一个常用的组件(主要使用ViewPager+ImageLoader),以后每次调用时,用起来方便:)

先看下效果图:


自定义的控件为BannerImg类,首先看布局文件

bannerimg.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <android.support.v4.view.ViewPager
        android:id="@+id/imagePager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/dotsImg"
        android:gravity="center_horizontal"
        android:layout_gravity="bottom|center_horizontal">

    </LinearLayout>
</FrameLayout>

然后是类文件

BannerImg.java

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
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.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Created by Administrator on 2015-12-30.
 */
public class BannerImg extends FrameLayout {
    private final static boolean isAutoPlay = true;
    private List<String> imageUris;
    private List<ImageView> imageViewsList;
    private List<ImageView> dotViewsList;
    private LinearLayout mLinearLayout;
    private ViewPager mViewPager;
    private int currentItem  = 0;
    private ScheduledExecutorService scheduledExecutorService;
    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            mViewPager.setCurrentItem(currentItem);
        }
    };
    //使用ImageLoader加载网络图片
    ImageLoader imageLoader = ImageLoader.getInstance();
    DisplayImageOptions options = new DisplayImageOptions.Builder()
            .showImageForEmptyUri(R.mipmap.image_for_empty_url)
    .showImageOnFail(R.mipmap.image_for_empty_url)
    .resetViewBeforeLoading(true)
    .cacheOnDisk(true)
    .imageScaleType(ImageScaleType.EXACTLY)
    .bitmapConfig(Bitmap.Config.RGB_565)
    .considerExifParams(true)
    .displayer(new FadeInBitmapDisplayer(300)).build();
    public BannerImg(Context context) {
        this(context,null);
    }
    public BannerImg(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public BannerImg(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
        initUI(context);
        if(!(imageUris.size()<=0))
        {
            setImageUris(imageUris);
        }
        if(isAutoPlay){
            startPlay();
        }

    }
    private void initUI(Context context){
        imageViewsList = new ArrayList<ImageView>();
        dotViewsList = new ArrayList<ImageView>();
        imageUris=new ArrayList<String>();
        LayoutInflater.from(context).inflate(R.layout.bannerimg, this, true);
        mLinearLayout=(LinearLayout)findViewById(R.id.dotsImg);
        mViewPager = (ViewPager) findViewById(R.id.imagePager);
        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
        config.threadPriority(Thread.NORM_PRIORITY - 2);
        config.denyCacheImageMultipleSizesInMemory();
        config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
        config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
        config.tasksProcessingOrder(QueueProcessingType.LIFO);
        config.writeDebugLogs(); // Remove for release app
        // Initialize ImageLoader with configuration.
        imageLoader.init(config.build());
    }
    public void setImageUris(List<String> imageuris)
    {
        for(int i=0;i<imageuris.size();i++)
        {
            imageUris.add(imageuris.get(i));
        }
        for (int i = 0; i < imageUris.size(); i++) {
            ImageView imageView = new ImageView(getContext());
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);//铺满屏幕
            imageLoader.displayImage(imageUris.get(i), imageView, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                }

                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                }
            });
            imageViewsList.add(imageView);
            ImageView viewDot =  new ImageView(getContext());
            if(i == 0){
                viewDot.setBackgroundResource(R.mipmap.dot_focus);
            }else{
                viewDot.setBackgroundResource(R.mipmap.dot);
            }
            dotViewsList.add(viewDot);
            mLinearLayout.addView(viewDot);
        }
        mViewPager.setFocusable(true);
        mViewPager.setAdapter(new MyPagerAdapter());
        mViewPager.setOnPageChangeListener(new MyPageChangeListener());
    }


    private void startPlay(){
        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleAtFixedRate(new BannerTask(), 1, 4, TimeUnit.SECONDS);
    }

    @SuppressWarnings("unused")
    private void stopPlay(){
        scheduledExecutorService.shutdown();
    }
    /**
     * 设置选中的圆点的背景
     * @param selectItems
     */
    private void setImageBackground(int selectItems){
        for(int i=0; i<dotViewsList.size(); i++){
            if(i == selectItems){
                dotViewsList.get(i).setBackgroundResource(R.mipmap.dot_focus);
            }else{
                dotViewsList.get(i).setBackgroundResource(R.mipmap.dot);
            }
        }
    }
    private class MyPagerAdapter  extends PagerAdapter {
        @Override
        public void destroyItem(View container, int position, Object object) {
            // TODO Auto-generated method stub
            //((ViewPag.er)container).removeView((View)object);
            ((ViewPager)container).removeView(imageViewsList.get(position));
        }

        @Override
        public Object instantiateItem(View container, int position) {
            // TODO Auto-generated method stub
            ((ViewPager)container).addView(imageViewsList.get(position));
            return imageViewsList.get(position);
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return imageViewsList.size();
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            // TODO Auto-generated method stub
            return arg0 == arg1;
        }
        @Override
        public void restoreState(Parcelable arg0, ClassLoader arg1) {
            // TODO Auto-generated method stub
        }

        @Override
        public Parcelable saveState() {
            // TODO Auto-generated method stub
            return null;
        }
    }


    private class MyPageChangeListener implements ViewPager.OnPageChangeListener {
        boolean isAutoPlay = false;
        @Override
        public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub
            switch (arg0) {
                case 1:
                    isAutoPlay = false;
                    break;
                case 2:
                    isAutoPlay = true;
                    break;
                case 0:
          <span style="font-family: Arial, Helvetica, sans-serif;">                    //如果滑到最后,就从头开始</span>
                    if (mViewPager.getCurrentItem() == mViewPager.getAdapter().getCount() - 1 && !isAutoPlay) {
                        mViewPager.setCurrentItem(0);
                    }
                    //如果滑到头就从尾开始
                    else if (mViewPager.getCurrentItem() == 0 && !isAutoPlay) {
                        mViewPager.setCurrentItem(mViewPager.getAdapter().getCount() - 1);
                    }
                    break;
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onPageSelected(int pos) {
            // TODO Auto-generated method stub
            setImageBackground(pos);
        }
    }



    private class BannerTask implements Runnable{
        @Override
        public void run() {
            // TODO Auto-generated method stub
            synchronized (mViewPager) {
                currentItem = (currentItem+1)%imageViewsList.size();
                handler.obtainMessage().sendToTarget();
            }
        }
    }
    
}

上面 控件设计好了,就看如何使用了,我们放到MainActivity中看效果,

activity_main.xml

<LinearLayout 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:orientation="vertical"
    android:background="@color/balack_thin"
    android:paddingBottom="10dp">

    <com.test.controls.BannerImg
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/mainBanner"></com.test.controls.BannerImg>

</LinearLayout>

然后看MainActivity.java调用代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        BannerImg bannerImg=(BannerImg)findViewById(R.id.mainBanner);
        List<String> imgs=new ArrayList<String>();
        imgs.add(0,"http://www.tot.name/app/banner/1.jpg");
        imgs.add(1,"<span style="font-family: Arial, Helvetica, sans-serif;">http://www.tot.name</span>/app/banner/2.jpg");
        imgs.add(2,"http://www.tot.name/app/banner/3.jpg");
        imgs.add(3,"http://www.tot.name/app/banner/4.jpg");
        imgs.add(4,"http://www.tot.name/app/banner/5.jpg");
        bannerImg.setImageUris(imgs);
    }


看看,是不是比较简单。这样就完成了。

逆向分析踩坑记:当Frida在x86模拟器上‘看不见’ARM的so文件时,我们该如何手动定位与验证? 本文探讨了在x86模拟器上使用Frida进行逆向分析时,无法检测到ARM架构so文件的解决方案。通过分析内存映射、Frida的视觉盲区及手动定位技术,提供了兼容层、混合调试和原生ARM环境三种实用方案,帮助逆向工程师突破工具限制,实现精准定位与验证。 阅读详情

相关推荐

激光SLAM算法性能对比:在Ubuntu20.04上实测Point-LIO/FAST_LIO2/Faster-LIO的运行效果

本文在Ubuntu 20.04平台上对Point-LIO、FAST-LIO2和Faster-LIO三款激光SLAM算法进行了深度实测与性能对比。通过量化分析绝对轨迹误差、CPU/内存占用及单帧处理延迟等核心指标,结合室内外场景数据,为高精度测绘、服务机器人及自动驾驶等不同应用场景提供了清晰的选型指南和实战调优建议。

weixin_28335283的博客 368

img宽度和全屏banner图注意事项

img标签引用图片路径时会把整个图片的全貌都显示出来,若img指定宽度大于图片的实际宽度,则图片会被拉伸显示,若img指定的宽度小于图片的实际宽度,则图片会被挤压缩小显示,总之图片一定会显示出全貌而不能只显示局部。 在做全屏banner图时应考虑到PC显示器的分辨率有1024*768、1366*768、1440*768、1600*900、1900*1200等多种不同的尺寸大小,为了能适应所有

止水 1万+

【零基础入门哈希签名架构,从Lamport到SPHINCS+】第二集 哈希签名树 Merkle Tree Authentication

在第一集中,我们一直忽略了一个问题。设想一下,假如有一个Hacker(黑客),在截获到Sender发送给Receiver的公钥之后,把这个公钥改成Hacker自己的公钥,然后再发给Receiver,那么Receiver就会误认为这是Sender的公钥。所以我们之前所说放方案,其安全性都需要建立在一个前提下:Receiver需要确认公钥确实是Sender发出的。

m0_50572808的博客 2453

Android实现轮播控件Banner

Android的ViewPager实现轮播图

ruanyandong的博客 3337

solidworks vba二次开发配合问题

solidworks vba二次开发配合问题二次开发装配的步骤 二次开发装配的步骤 solidworks可以使用宏录制配合过程从而得到配合的vba代码,步骤如下: 1.选择两个配合的面(点、线等) 2. 建立配合 例如将两个圆柱面同心(图中高亮): 配合后 我们看一下宏录制的代码: Sub main() //激活solidworks接口 Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc //选择两个圆柱面,注意此处是根据坐标选择,不

Alejandro123的博客 3405

winpcap无法安装提示新版本已经安装解决办法

问题显示如下该问题会导致ensp里的云识别不到网卡可能是因为之前安装了npcap,而且安装时勾选了第四个选项导致无法安装,需要完全卸载npcap解决办法:办法一:在控制面板的程序与卸载里面卸载npcap和winPcap,然后再安装winPcap,如果搜不到往下看办法二:在C:\Windows\SysWOW64目录下搜索wpcap.dll和packet.dll并重命名为wpcap.dll.old和packet.dll.old办法三:如果搜不到这两个文件需要安装win10Pcap才能找到这两个文件下载地址:Wi

qq_73202377的博客 3万+

平缓的banner图片切换效果

平时所写的banner图片滚动效果要么是从左至右滚动,要么是从右至左滚动。这种效果利用的原理是banner图的父盒子绝对定位,每隔一段时间移动父盒子的位置,如left=“”; 而现在很多网站开始使用的是图片没有位移的切换效果,一般都是使图片绝对定位,给当前要显示的图片设置z-index的值。但传统的使用fadeIn或者fadeOut会出现扎眼的情况。这次经理要求使用更平缓的效果,所以想到了c

qq_27675083的博客 1357

实验三 Gmapping建图

自主移动机器人第三次实验课,内容包括:(1)turtlebot的gmapping建图;(2)rosbag的使用;(3)gazebo中的gmapping建图。

lj164567487的博客 4649

【PC端网页特效】04-原生JS实现网页轮播图详解

(PC端网页特效)原生JS实现网页轮播图

SevgiliD的博客 1181

从生成到检测:全面解析Deepfake技术的演进与对抗策略

本文全面解析了Deepfake技术的演进与对抗策略,从GAN生成技术到先进的检测手段,探讨了其在娱乐与安全领域的双重影响。文章详细介绍了Deepfake的核心原理、技术迭代关键节点以及最新的检测方法,揭示了AI生成与识别的激烈博弈。同时,展望了量子计算和生物特征认证在未来攻防战中的潜在应用。

jenkins8butler的博客 255

【信号与系统】Multisim 仿真信号合成与分解

软件 Multisim 进行方波信号的产生、分解和合成,观察信号波形的分解与合成,加深对信号频谱的理解。

AXYZdong的博客 2万+

如何在Android Studio中创建和使用Banner组件

在本文中,我们通过使用Android Studio和Kotlin来创建一个简单的Banner组件,演示了ViewPager2和RecyclerView的结合使用。这种方法适用于创建可定制和动态的广告或信息展示组件。希望这篇文章能帮助你在Android开发中更有效地利用Banner组件!

2301_79646180的博客 1423

YOLOv11 改进 - 注意力机制 | HaloNet 局部自注意力 (Local Self-Attention) 以分块交互策略实现高效全局上下文建模

本文介绍了局部自注意力机制(HaloAttention)在YOLOv11中的结合应用。局部自注意力通过关注输入数据局部区域来捕捉特征关系,能降低计算复杂度、增强局部特征捕捉,且可与CNN结合。其计算时先定义局部窗口,再计算注意力权重并加权求和。我们将HaloAttention集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,改进后的模型在目标检测和实例分割等任务中表现更佳,证明了自注意力模型在传统卷积主导领域的有效性。

魔改工程师的博客 1142

打造一个轻量级,简单,易用的Android Banner框架

愿你有一天,真爱自己,善待自己。既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)[外链图片转存中…(img-002302nF-1712004089289)]愿你有一天,真爱自己,善待自己。

碧海朝天素 840

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android imageview 加载网络图片

Android imageview 加载网络图片

qq_27494201的博客 545

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android 广告图片轮播控件 Banner 安装与配置指南

--- ## 项目基础介绍与编程语言 本项目名为 **Banner**,是由 GitHub 用户 youth5201314 开发的一个专注于 Android 平台的广告图片轮播控件。它基于 Android 的 `ViewPager2` 实现,提供了强大的自定义能力和灵活性,包括 Indicator 和 UI 设计的高度定制选项。项目主要使用的编程语言为 **Java**,并兼容 Kotlin。...

gitblog_09437的博客 1046

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android中左右滑屏的实现(广告位banner组件)

原理 参见下图。整个组件是一个FrameLayout,里面有两个view,第一个是LinearLayout,承载了4个(或多个)可以滑动的view,见图中绿色背景的部分;第二个是一个RelativeLayout,在其底部放置了一个LinearLayout,在LinearLayout的内部放置了若干个小圆点,用来指示当前屏幕的索引。手势检测用了GestureDetector,并实现了OnGestu

zzdf 1030

android popwindow仿微信右上角弹出框,dialog底部显示

TextViewandroid:text=“发起聊天”

2401_84132589的博客 534

Android知识点5-Universal_image_loader加载网络图片

开源框架的使用,使我们更快的开发,增加了效率,今天就来学习一下Universal_image_loader的用法。转载请标明出处:首先,去github上下载所需要的jar包,下载地址:https://github.com/nostra13/Android-Universal-Image-Loader; 接着就是搭配环境了 1-将下载的jar包放到工程的lib包,并创建一个显示图片的布局<Rela

Happy 932

banner图/轮播图----html

四张图片 轮播 效果如下 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>banner</title> <style type="text/css"> ...

1900的博客 7145

Android 开发 1分钟搞定ImageView 加载网络图片

但日常开发的过程中,加载服务器图片是不可缺少的一项重要任务。首先定义一个BaseHttpImageView 的工具类。一般情况下,ImageView 仅支持本地文件的展示。是不是非常简单,完全不需要第三方框架就可以解决。最后直接在需要加载图片的位置设置就好了。XML布局文件中使用。

qq_38999743的博客 852

Android----banner使用详解

android:layout_height=“250dp” android:layout_margin=“10dp” app:banner_radius=“20dp” // 圆角 android:clickable=“true” // 是否可点击 app:banner_indicator_selected_color=“#95F2EC” app:layout_constraintEnd_toEndOf=“parent” app:layout_constraintHorizontal_bias=“

Android_1314的博客 3028

如何在macOS上轻松制作Windows启动盘:WinDiskWriter终极指南

还在为在Mac上创建Windows安装盘而烦恼吗?WinDiskWriter是一款专为macOS用户设计的免费开源工具,它让跨平台系统安装变得前所未有的简单。这个智能应用能帮你快速创建支持UEFI和Legacy BIOS双启动模式的Windows安装U盘,完美解决Mac用户安装Windows的各种技术难题。无论是为老旧电脑升级系统,还是创建多系统测试环境,这款macOS启动盘制作工具都能提供完整解

gitblog_00026的博客 475

【ImageView加载网上的图片】

☆Button衍生控件:ToggleButton, switch开关. ImageView:加载网络图片 import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ImageView; import com.bumptech.glide.Glide; public class ImageViewMainActivity extends AppCompatActivit

gwy2018的博客 2515

安卓首页界面:用Banner框架实现Android轮播图效果

1111

qq_68469751的博客 4066

仿小米官网轮播图(Banner)的实现

本篇是仿照小米官网所做的轮播图,注意事项(图片命名规则为 banner-img-0.jpg,banner-img-1.jpg 依此类推);实例代码如下:&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Title&lt

LQ的博客 3610
上一篇: 如何反编译Android 5.0 framework
下一篇: ScrollView嵌套ListView方法汇总
cctcc
博客等级 码龄23年 104粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值