安卓自定义控价学习笔记(一)

一.自定义控件

  1. 原生控件(imageview,button,textview)
  2. 自定控件
    1. 组合控件
    2. 自己绘制的控件(绘制,行为操作)

(一).View和ViewGroup

这里写图片描述

  1. 关系view和viewGroup

    1. 继承关系
    2. 组合关系
      这里写图片描述

      <LinearLayout>
          <RelativeLayout>
              <ImageView/>
              <LinearLayout/>
          </RelativeLayout>
          <Button/>
      </LinearLayout>
  2. 作用

    1. view: 提供实际的功能,提供了绘制的样式
    2. viewGroup:管理子控件,位置,大小
  3. View的形状: 方形

  4. 布局的层次: 后布局的在最上面一层
  5. View的绘制流程(相对性)

    1. mearsue: 测量,final,控制控件的大小
    2. layout: 布局,用来控制自己的布局位置
    3. draw: 绘制,用来控制控件的显示样式

    mearsure –> layout —> draw

    1. onMearsure:
    2. onLayout:
    3. onDraw:

    4. setMeasuredDimension(width,height): 用来设置自己的大小

    5. ViewGroup.onMeasure(): 给出孩子的期望大小值,设置自己大小的准确值

(二).ViewPager的使用案列

1. 案列功能分析:

  1. 滑动的切换图片
  2. 滑动时圆形点的切换
  3. 滑动文本的切换
  4. 无限滑动
    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>

猜你喜欢

转载自blog.csdn.net/jiang_xinxing/article/details/79362091