一.自定义控件
- 原生控件(imageview,button,textview)
- 自定控件
- 组合控件
- 自己绘制的控件(绘制,行为操作)
(一).View和ViewGroup
关系view和viewGroup
- 继承关系
组合关系
<LinearLayout> <RelativeLayout> <ImageView/> <LinearLayout/> </RelativeLayout> <Button/> </LinearLayout>
作用
- view: 提供实际的功能,提供了绘制的样式
- viewGroup:管理子控件,位置,大小
View的形状: 方形
- 布局的层次: 后布局的在最上面一层
View的绘制流程(相对性)
- mearsue: 测量,final,控制控件的大小
- layout: 布局,用来控制自己的布局位置
- draw: 绘制,用来控制控件的显示样式
mearsure –> layout —> draw
- onMearsure:
- onLayout:
onDraw:
setMeasuredDimension(width,height): 用来设置自己的大小
- ViewGroup.onMeasure(): 给出孩子的期望大小值,设置自己大小的准确值
(二).ViewPager的使用案列
1. 案列功能分析:
- 滑动的切换图片
- 滑动时圆形点的切换
- 滑动文本的切换
- 无限滑动
5.案列截图
2. 案列源码
MainActivity代码
package com.example.viewpageapp;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
public class MainActivity extends Activity implements OnPageChangeListener
{
private static final String TAG = "MainActivity";
private ViewPager mPager;
private LinearLayout mPointContainer;
private TextView mTvTitle;
private List<ImageView> mListDatas;
int[] imgs = { R.drawable.icon_1, R.drawable.icon_2, R.drawable.icon_3,
R.drawable.icon_4, R.drawable.icon_5 };
String[] titles = { "为梦想坚持", "我相信我", "就是明天", "google IO", "未来不是梦" };
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPager = (ViewPager) findViewById(R.id.pager);
mPointContainer = (LinearLayout) findViewById(R.id.point_container);
mTvTitle = (TextView) findViewById(R.id.tv_title);
//初始化数据
mListDatas = new ArrayList<ImageView>();
for (int i = 0; i < imgs.length; i++)
{
//给集合添加ImageView
ImageView iv = new ImageView(this);
iv.setImageResource(imgs[i]);
iv.setScaleType(ScaleType.FIT_XY);
mListDatas.add(iv);
//添加点
View point = new View(this);
point.setBackgroundResource(R.drawable.point_normal);
LayoutParams params = new LayoutParams(10, 10);
if (i != 0)
{
params.leftMargin = 10;
}
else
{
point.setBackgroundResource(R.drawable.point_selected);
mTvTitle.setText(titles[i]);
}
mPointContainer.addView(point, params);
}
//设置数据的方式
mPager.setAdapter(new MyAdapter());
//设置监听器
mPager.setOnPageChangeListener(this);
//设置默认选中中间的item
int middle = Integer.MAX_VALUE / 2;
int extra = middle % mListDatas.size();
int item = middle - extra;
mPager.setCurrentItem(item);
}
class MyAdapter extends PagerAdapter
{
//页面的数量
@Override
public int getCount()
{
if (mListDatas != null)
{
return Integer.MAX_VALUE;
}
return 0;
}
// 标记方法,用来判断缓存标记
@Override
public boolean isViewFromObject(View view, Object object)
{
return view == object;
}
//初始化item
@Override
public Object instantiateItem(ViewGroup container, int position)
{
position = position % mListDatas.size();
//position: 要加载的位置
ImageView iv = mListDatas.get(position);
//用来添加要显示的View的
mPager.addView(iv);
//记录缓存标记--return 标记
return iv;
}
//销毁item条目
@Override
public void destroyItem(ViewGroup container, int position, Object object)
{
//销毁移除item
//object:标记
position = position % mListDatas.size();
ImageView iv = mListDatas.get(position);
mPager.removeView(iv);
}
}
//回调方法,当viewpager滚动时的回调
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels)
{
//position: 当前选中的位置
//positionOffset: 滑动的百分比
//positionOffsetPixels: 偏移的距离,滑动的像素
//Log.d(TAG, "onPageScrolled : " + positionOffsetPixels + " "
//+ positionOffset);
}
//回调方法,当viewpager的某个页面选中时的回调
@Override
public void onPageSelected(int position)
{
//Log.d(TAG, "onPageSelected : " + position);
position = position % mListDatas.size();
//设置选中的点的样式
int count = mPointContainer.getChildCount();
for (int i = 0; i < count; i++)
{
View view = mPointContainer.getChildAt(i);
view.setBackgroundResource(position == i ? R.drawable.point_selected
: R.drawable.point_normal);
}
mTvTitle.setText(titles[position]);
}
//回调方法,当viewpager的滑动状态改变时的回调
//@see ViewPager#SCROLL_STATE_IDLE : 闲置状态
//@see ViewPager#SCROLL_STATE_DRAGGING :拖动状态
//@see ViewPager#SCROLL_STATE_SETTLING: 固定状态
@Override
public void onPageScrollStateChanged(int state)
{
//Log.d(TAG, "onPageScrollStateChanged : " + state);
}
}
layout布局代码
<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=".MainActivity" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="180dp" >
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="180dp" >
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#33000000"
android:orientation="vertical"
android:padding="5dp" >
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="图片的title"
android:textColor="@android:color/white" />
<LinearLayout
android:id="@+id/point_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:orientation="horizontal" >
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
drawable内代码
选中时
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<corners android:radius="5dp" />
<solid android:color="@android:color/white" />
</shape>
未选中时
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<corners android:radius="5dp" />
<solid android:color="#ff0000" />
</shape>
AndroidManifest.xml代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.viewpageapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.viewpageapp.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>