AndroID自定义控件:广告栏效果
二、ListVIEw和VIEwPager的使用步骤(1)ListVIEw的使用在布局文件中定义ListVIEw在代码中实例化ListVIEw准备数据设置适配器–item布局–绑定数据(2)VIEwPager的使用在布局文件中定义VIEwPager在代码中实例化VIEwPager准备数据设置适配器(PagerAdapter)–item布局–绑定数据三、广告条效果(1)activity_guanggaotiao.xml布局文件<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"><!-- 定义一个VIEwPager--> <androIDx.vIEwpager.Widget.VIEwPager androID:ID="@+ID/vIEwpager" androID:layout_wIDth="match_parent" androID:layout_height="180dp" /> <linearLayout androID:background="#44000000" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:orIEntation="vertical" androID:padding="5dp" androID:layout_alignBottom="@ID/vIEwpager"><!-- 设置标题--> <TextVIEw androID:ID="@+ID/tv_Title" androID:layout_gravity="center_horizontal" androID:padding="3dp" androID:text="这是一个TextVIEw" androID:textcolor="#ffffff" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content"/><!-- 用来安放滑动的点--> <linearLayout androID:ID="@+ID/ll_point_group" androID:layout_gravity="center_horizontal" androID:orIEntation="horizontal" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content"/> </linearLayout></relativeLayout>
(2)Guanggaotiao.java文件package com.swpuiot.test;import androID.os.Bundle;import androID.os.Handler;import androID.os.Message;import androID.util.Log;import androID.vIEw.MotionEvent;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.ImageVIEw;import androID.Widget.linearLayout;import androID.Widget.TextVIEw;import androID.Widget.Toast;import androIDx.annotation.NonNull;import androIDx.annotation.Nullable;import androIDx.appcompat.app.Actionbar;import androIDx.appcompat.app.AppCompatActivity;import androIDx.vIEwpager.Widget.PagerAdapter;import androIDx.vIEwpager.Widget.VIEwPager;import java.util.ArrayList;public class Guanggaotiao extends AppCompatActivity { //设置一个标签 private static final String TAG = Guanggaotiao.class.getSimplename(); //定义布局文件中需要用到的变量 private VIEwPager vIEwPager; private TextVIEw tv_Title; private linearLayout ll_point_group; //定义图片列表 private ArrayList<ImageVIEw> imageVIEws; //图片资源ID private final int[] imageIDs = { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e }; //图片标题集合 private final String[] imageDescriptions = { "风景美如画", "桂林山水甲天下", "阳朔山水甲桂林", "行千里致广大", "绿水青山就是金山银山" }; //上一次圆点高亮显示的位置 private int preposition = 0; //是否已经滚动 private boolean isDragging= false; //利用handler让子线程延迟4秒通知主线程更新ui到VIEwPager的下一张图片 private Handler handler = new Handler(){ @OverrIDe public voID handleMessage(@NonNull Message msg) { super.handleMessage(msg); int item = vIEwPager.getCurrentItem()+1; vIEwPager.setCurrentItem(item); //延迟发消息 handler.sendEmptyMessageDelayed(0,4000); } }; @OverrIDe protected voID onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_guanggaotiao); //将系统自带的标题栏去掉 Actionbar actionbar = getSupportActionbar(); actionbar.hIDe(); //调用实例化布局控件的方法 initVIEw(); //实例化图片列表 imageVIEws = new ArrayList<>(); for (int i = 0; i < imageIDs.length; i++) { ImageVIEw imageVIEw = new ImageVIEw(this); imageVIEw.setBackgroundResource(imageIDs[i]); //将设置了图片资源的imageVIEw添加到imageVIEws图片列表中 imageVIEws.add(imageVIEw); //动态添加点 ImageVIEw point = new ImageVIEw(this); point.setBackgroundResource(R.drawable.point_selector); linearLayout.LayoutParams params = new linearLayout.LayoutParams(8,8); //第一个默认是红色 if(i == 0){ point.setEnabled(true); }else{ //不是第一个的话,将点设置成灰色,距左边控件8dp point.setEnabled(false); params.leftmargin = 8; } //每个点的参数wIDth=8 height=8 point.setLayoutParams(params); //将点添加到linearLayout中 ll_point_group.addVIEw(point); } //4. 设置适配器(PagerAdapter)-item布局-绑定数据 vIEwPager.setAdapter(new MyPagerAdapter()); //设置监听VIEwPager页面的改变 vIEwPager.addOnPagechangelistener(new MyOnPagechangelistener()); //设置中间位置,左右都能够滑动,需要保证item为imageVIEws.size()的整数倍 int item = Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2%imageVIEws.size(); vIEwPager.setCurrentItem(item); tv_Title.setText(imageDescriptions[preposition]); //隔3秒钟发消息 handler.sendEmptyMessageDelayed(0,3000); } //实例化布局控件的方法 private voID initVIEw() { vIEwPager = findVIEwByID(R.ID.vIEwpager); tv_Title = findVIEwByID(R.ID.tv_Title); ll_point_group = findVIEwByID(R.ID.ll_point_group); } //自定义监听VIEwPager页面的改变的类 class MyOnPagechangelistener implements VIEwPager.OnPagechangelistener{ /** * 当页面滚动了的时候回调这个方法 * @param position 当前页面的位置 * @param positionOffset 滑动页面的百分比 * @param positionOffsetPixels 在屏幕上滑动的像素 */ @OverrIDe public voID onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } /** * 当某个页面被选中了的时候回调 * @param position 被选中页面的位置 */ @OverrIDe public voID onPageSelected(int position) { int realposition = position%imageVIEws.size(); //设置对应页面的文本信息 tv_Title.setText(imageDescriptions[realposition]); //把上一个高亮的设置为默认-灰色 ll_point_group.getChildAt(preposition).setEnabled(false); //当前的设置为高亮-红色 ll_point_group.getChildAt(realposition).setEnabled(true); preposition = realposition; } /** * 当页面滚动状态变化的时候回调这个方法 * 静止 -> 滑动 * 滑动 -> 静止 * 静止 -> 拖拽 * @param state */ @OverrIDe public voID onPageScrollStateChanged(int state) { if(state == VIEwPager.SCRolL_STATE_DRAGGING){ isDragging = true; Log.e(TAG, "SCRolL_STATE_DRAGGING---------------------- "); }else if(state == VIEwPager.SCRolL_STATE_SETTliNG){ Log.e(TAG, "onPageScrollStateChanged---------------------- "); }else if(state == VIEwPager.SCRolL_STATE_IDLE && isDragging){ isDragging = false; Log.e(TAG, "onPageScrollStateChanged---------------------- "); handler.removeCallbacksAndMessages(null); handler.sendEmptyMessageDelayed(0,4000); } } } //自定义viewPager适配器的类 class MyPagerAdapter extends PagerAdapter { /** * 相当于getVIEw方法 * @param container VIEwPager自身 * @param position 当前实例化页面的位置 * @return */ @NonNull @OverrIDe public Object instantiateItem(@NonNull VIEwGroup container, int position) { int realposition = position%imageVIEws.size(); final ImageVIEw imageVIEw = imageVIEws.get(realposition); //添加到VIEwPager中 container.addVIEw(imageVIEw); Log.e(TAG, "instantiateItem==" + position + ",---imageVIEw==" + imageVIEw); //添加触摸事件 imageVIEw.setontouchListener(new VIEw.OntouchListener() { @OverrIDe public boolean ontouch(VIEw vIEw, MotionEvent motionEvent) { switch (motionEvent.getAction()){ //手指按下控件 case MotionEvent.ACTION_DOWN: Log.e(TAG, "ontouch: 手指按下"); handler.removeCallbacksAndMessages(null); break; //手指在控件上移动 case MotionEvent.ACTION_CANCEL: Log.e(TAG, "ontouch: 事件取消"); handler.removeCallbacksAndMessages(null); handler.sendEmptyMessageDelayed(0,4000); break; //手指离开 case MotionEvent.ACTION_UP: Log.e(TAG, "ontouch: 手指离开"); handler.sendEmptyMessageDelayed(0,4000); break; } return false; } }); //添加点击事件 imageVIEw.setTag(position); imageVIEw.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw vIEw) { Log.e(TAG, "onClick: 点击事件"); int position = (int) vIEw.getTag()%imageVIEws.size(); String text = imageDescriptions[position]; Toast.makeText(Guanggaotiao.this, "text==" + text, Toast.LENGTH_SHORT).show(); } }); return imageVIEw; } /** * 释放资源 * @param container vIEwpager * @param position 要释放的位置 * @param object 要释放的页面 */ @OverrIDe public voID destroyItem(@NonNull VIEwGroup container, int position, @NonNull Object object) { Log.e(TAG, "destroyItem==" + position + ",---object==" + object); container.removeVIEw((VIEw) object); } /** * 得到图片总数 * @return */ @OverrIDe public int getCount() {// return imageVIEws.size(); //将数值返回很大,以便于能够左右无限滑动 return Integer.MAX_VALUE; } /** * 比较vIEw和object是否同一个实例 * @param vIEw 页面 * @param object 方法instantiateItem返回的结果 * @return */ @OverrIDe public boolean isVIEwFromObject(@NonNull VIEw vIEw, @NonNull Object object) { return vIEw == object; } }}
(3)其中涉及到的drawable文件point_selector.xml、point_normal.xml和point_presss.xmlpoint_selector.xml<?xml version="1.0" enCoding="utf-8"?><selector xmlns:androID="http://schemas.androID.com/apk/res/androID"> <item androID:state_enabled="false" androID:drawable="@drawable/point_normal"/> <item androID:state_enabled="true" androID:drawable="@drawable/point_press"/></selector>
point_normal.xml<?xml version="1.0" enCoding="utf-8"?><shape xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:shape="oval"> <size androID:wIDth="8dp" androID:height="8dp"/> <solID androID:color="#44000000"/></shape>
point_press.xml<?xml version="1.0" enCoding="utf-8"?><shape xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:shape="oval"> <size androID:height="8dp" androID:wIDth="8dp"/> <solID androID:color="#ff0000"/></shape>
总结 以上是内存溢出为你收集整理的Android自定义控件:广告条效果全部内容,希望文章能够帮你解决Android自定义控件:广告条效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)