自定义控件---系统控件组合式(案例二)

-----------------------------------------------案例效果-------------------------------------

activity_main.xml

<RelativeLayout 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/viewPager"
        android:layout_width="match_parent"
        android:layout_height="200dip" />

    <LinearLayout
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/viewPager"
        android:background="#44000000"
        android:orientation="vertical" >

        <TextView
            android:singleLine="true"
            android:id="@+id/tv_msg"
            android:textColor="#ffffff"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="武媚娘传奇"
            android:textSize="18sp" />

        <LinearLayout
            android:id="@+id/ll_point_group"
            android:padding="5dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

drawable目录下有三个xml文件

point_bg.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/normal_point"></item>
    <item android:state_enabled="true" android:drawable="@drawable/focused_point"></item>

</selector>

normal_point.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <size android:width="10dip" android:height="10dip"/>
    <solid android:color="#55000000"/>

</shape>

focused_point.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >
    <!-- 椭圆 -->
    <size android:width="10dip" android:height="10dip"/>
    <solid android:color="#66ffffff"/>

</shape>

MainActivity.java

package com.atguigu.myviewpager;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

public class MainActivity extends Activity {
	// viewPager继承viewGroup
	private ViewPager viewPager;
	private TextView tv_msg;
	// 显示当前页的圆点标志布局视图
	private LinearLayout ll_point_group;

	/**
	 * 图片的int数组集合 图片标题集合 图片集合
	 */
	private int[] ids = { R.drawable.a, R.drawable.b, R.drawable.c,
			R.drawable.d, R.drawable.e };
	private final String[] imageDescriptions = { "巩俐不低俗,我就不能低俗",
			"朴树又回来啦!再唱经典老歌引万人大合唱", "揭秘北京电影如何升级", "乐视网TV版大派送", "热血屌丝的反杀" };
	private ArrayList<ImageView> imageViews;

	// 上一次被高亮显示的位置
	private int lastIndex = 0;

	// 是否已经执行了Activity中的onDestroy true:执行 false:没有执行
	private boolean isDestroy = false;;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 获取viewPager
		viewPager = (ViewPager) findViewById(R.id.viewPager);
		// 获取图片说明
		tv_msg = (TextView) findViewById(R.id.tv_msg);
		// 获取圆点线性布局
		ll_point_group = (LinearLayout) findViewById(R.id.ll_point_group);

		/**
		 * 准备需要的数据 1、初始化圆点集合数据 2、获取图片集合数据
		 */
		imageViews = new ArrayList<ImageView>();
		for (int i = 0; i < ids.length; i++) {
			// 1、实例化图片,并且设置背景
			ImageView imageView = new ImageView(this);
			imageView.setBackgroundResource(ids[i]);
			// 把图片添加到集合中
			imageViews.add(imageView);

			// 2、设置圆点图片背景
			ImageView iv_point = new ImageView(this);
			iv_point.setBackgroundResource(R.drawable.point_bg);
			// 导入的包应该是父类的参数
			LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
					LayoutParams.WRAP_CONTENT);
			iv_point.setLayoutParams(params);
			// 圆点之间有距离
			params.leftMargin = 10;
			// 默认第一个圆点是高亮显示(第一个图片被选中)
			if (i == 0) {
				iv_point.setEnabled(true);
			} else {
				iv_point.setEnabled(false);
			}
			ll_point_group.addView(iv_point);
		}
		/**
		 * 创建并且设置适配器
		 */
		MyPagerAdapter adapter = new MyPagerAdapter();
		viewPager.setAdapter(adapter);
		// ????
		int item = Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2
				% imageViews.size();
		// 22->11
		Log.e("TAG",item+"-----" );
		// 设置为中间????
		viewPager.setCurrentItem(item);

		// 设置默认文本信息
		String msg = imageDescriptions[0];
		tv_msg.setText(msg);

		// 监听页面改变
		viewPager.setOnPageChangeListener(new OnPageChangeListener() {

			/**
			 * 当选择某个页面的时候回调 position:把选择的位置传过来
			 */
			@Override
			public void onPageSelected(int position) {

				int myposition = position % imageViews.size();
				// 根据位置取出对应的文本
				String msg = imageDescriptions[myposition];
				tv_msg.setText(msg);

				ll_point_group.getChildAt(lastIndex).setEnabled(false);
				ll_point_group.getChildAt(myposition).setEnabled(true);
				lastIndex = myposition;

			}

			/**
			 * 当页面滑动了或者滚动了的时候,回调这个方法 position:页面的下标 positionOffset:滑动的页面比
			 * positionOffsetPixels:滑动了多少的像素
			 */
			@Override
			public void onPageScrolled(int position, float positionOffset,
					int positionOffsetPixels) {
			}

			/**
			 * 当页面滑动状态发送变化的时候回调这个方法
			 */
			@Override
			public void onPageScrollStateChanged(int state) {
			}
		});

		// 发消息开始自动切换图片
		isDestroy = false;
		// 一加载页面,就先发一个3秒延迟消息
		handler.sendEmptyMessageDelayed(0, 3000);
	}

	/*
	 * handler
	 */
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {

			// 切换到下一个页面
			viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
			// 循环显示图片-不断切换
			if (true) {
				// 每隔4秒图片切换一下-自己本身处理消息
				handler.sendEmptyMessageDelayed(0, 4000);
			}
		};
	};

	/**
	 * 退出应用
	 */
	@Override
	protected void onDestroy() {
		super.onDestroy();
		isDestroy = true;
	}

	/**
	 * 适配器类
	 */
	class MyPagerAdapter extends PagerAdapter {
		// 得到数据的总条数
		@Override
		public int getCount() {
			return Integer.MAX_VALUE;
		}

		// 相当于:getView(); container:就是一个容器,就是ViewPager
		// position:位置下标
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			// 根据位置得到具体的页面
			Log.e("TAG",position+"" );
			Log.e("TAG",position % imageViews.size()+"" );
			ImageView imageView = imageViews.get(position % imageViews.size());
			// 把图片添加到ViewPager里面
			container.addView(imageView);
			return imageView;
		}

		/**
		 * 比较view是否是由instantiateItem所实例化的 view 当前页面 object:instantiateItem方法返回的值
		 */
		@Override
		public boolean isViewFromObject(View view, Object object) {
			return view == object;
		}

		/**
		 * 根据位置移除对应的被销毁的控件
		 */
		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			container.removeView((View) object);
		}
	}
}
时间: 2024-10-15 21:45:40

自定义控件---系统控件组合式(案例二)的相关文章

自定义控件---系统控件组合式(案例一)

-----------------------------案例一---------------动画效果不截图了------------------------------------- activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:la

自定义控件---系统控件组合式(案例三)

效果图如下 -------------------------------------------------- activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_pa

Android自定义用户控件简单范例(二)

对于完全由后台定制的控件,并不是很方便其他人的使用,因为我们常常需要看到控件放到xml界面上的效果,并根据效果进行布局的调整,这就需要一个更加标准的控件制作流程: 我们的自定义控件和其他的控件一样,应该写成一个类,而这个类的属性是是有自己来决定的. 我们要在res/values目录下建立一个attrs.xml的文件,并在此文件中增加对控件的属性的定义. 使用AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来. 在自定义控件类中使

【读书笔记-《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)

3.9 TabSpec与TabHost TabHost类官方文档地址:http://developer.android.com/reference/android/widget/TabHost.html Android 实现tab视图有2种方法,一种是在布局页面中定义<tabhost>标签,另一种就是继承tabactivity.但是我比较喜欢第二种方式,应为如果页面比较复杂的话你的XML文件会写得比较庞大,用第二种方式XML页面相对要简洁得多. <?xml version="1

【读书笔记-《Android游戏编程之从零开始》】3.Android 游戏开发常用的系统控件(Button、Layout、ImageButton)

3.1 Button Button这控件不用多说,就是一个按钮,主要是点击后进行相应事件的响应. 给组件添加ID属性:定义格式为 android:id="@+id/name",这里的name是自定义的,不是索引变量."@+"表示新声明,"@"表示引用,例如:"@+id/tv" 表示新声明一个id,是id名为tv的组件:"@id/tv" 表示引用id名为tv的组件. 给按钮添加点击事件响应  想知道按钮是否被

Android调用相册拍照控件实现系统控件缩放切割图片

android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家 package cn.m15.test; import java.io.ByteArrayOutputStream;import java.io.File;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.net.Ur

【读书笔记-《Android游戏编程之从零开始》】8.Android 游戏开发常用的系统控件(系统控件常见问题)

Android 中常用的计量单位Android有时候需要一些计量单位,比如在布局Layout文件中可能需要指定具体单位等.常用的计量单位有:px.dip(dp).sp,以及一些不常用的pt.in.mm.下面详细介绍下这些计量单位之间的区别和联系.in:英寸(长度单位):mm:毫米(长度单位):pt:磅/点,1/72英寸(一个标准的长度单位):sp:全名 scaled pixels-best for text size,放大像素,与刻度无关,可以根据用户的字体大小就行缩放,主要用来处理字体的大小:

【读书笔记-《Android游戏编程之从零开始》】5.Android 游戏开发常用的系统控件(ProgressBar、Seekbar)

3.7 ProgressBar ProgressBar类官方文档地址:http://developer.android.com/reference/android/widget/ProgressBar.html 在Android应用开发中,ProgressBar(运行进度条)是比较常用到的组件,例如下载进度.安装程序进度.加载资源进度显示等.在Android中提供了两种样式来分别表示在不同状态下显示的进度条,下面来实现这两种样式.默认进度条是圆形,通过style属性来指定系统进度条的大小:sty

【读书笔记-《Android游戏编程之从零开始》】4.Android 游戏开发常用的系统控件(EditText、CheckBox、Radiobutton)

3.4 EditText EditText类官方文档地址:http://developer.android.com/reference/android/widget/EditText.html EditText继承TextView,所以EditText具有TextView的属性特点,下面主要介绍一些EditText的特有的输入法的属性特点android:layout_gravity="center_vertical":设置控件显示的位置:默认top,这里居中显示,还有bottomand