本文主要讲述了实现安卓button点击变色与利用ViewPager实现图片自动轮播效果

我伞可以看到在很多应用中,安卓按钮按下时与正常时状态是不同的,这种效果也很容易达到。

第一步:创建XML文件定义不同事件的不同效果

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/function_greenbutton_pressed" /> <!-- pressed --> <item android:state_focused="true"
android:drawable="@drawable/function_greenbutton_pressed" /> <!-- focused --> <item android:drawable="@drawable/function_greenbutton_normal" /> <!-- default -->
</selector>

在上面就定义了在pressed与normal情况下,安卓的图片会自动替换的效果。

第二步:在布局文件中加入定义好的按钮就可以了

  <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按下文字会变效果"
android:textColor="@drawable/btn_color"
android:background="@drawable/btn_bg"
/>

利用ViewPager实现自动轮播图片

<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" > <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="200dp" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#33000000"
android:orientation="vertical" > <TextView
android:id="@+id/image_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@android:color/white"
android:textSize="18sp" /> <LinearLayout
android:id="@+id/point_group"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" >
</LinearLayout>
</LinearLayout> </RelativeLayout>

注意viewPager引入时要用全类名,上面还定义了图片介绍与图片切换时小圆点也会切换

viewPager的主要方法

//设置适配器adapter
viewPager.setAdapter(new MyPagerAdapter());
//设置当前的位置,轮播到哪一个图片了
viewPager.setCurrentItem(Integer.MAX_VALUE/2 - (Integer.MAX_VALUE/2%imageList.size())) ;
//设置viewPager的监听事件
viewPager.setOnPageChangeListener(new OnPageChangeListener()

实现

适配器

private class MyPagerAdapter extends PagerAdapter {

        @Override
/**
* 获得页面的总数
*/
public int getCount() {
return Integer.MAX_VALUE;
} @Override
/**
* 获得相应位置上的view
* container view的容器,其实就是viewpager自身
* position 相应的位置
*/
public Object instantiateItem(ViewGroup container, int position) { System.out.println("instantiateItem ::"+position); // 给 container 添加一个view
container.addView(imageList.get(position%imageList.size()));
//返回一个和该view相对的object
return imageList.get(position%imageList.size());
} @Override
/**
* 判断 view和object的对应关系
*/
public boolean isViewFromObject(View view, Object object) {
if(view == object){
return true;
}else{
return false;
}
} @Override
/**
* 销毁对应位置上的object
*/
public void destroyItem(ViewGroup container, int position, Object object) {
System.out.println("destroyItem ::"+position); container.removeView((View) object);
object = null;
}
}

将当前页面总数设大一点,就可以实现无限循环了,viewpager总是只保持三个窗口,循环利用,并不会造成内存浪费,将当前项设置在中间,就可以左右自动循环了

事件监听实现

viewPager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
/**
* 页面切换后调用
* position 新的页面位置
*/
public void onPageSelected(int position) { position = position%imageList.size(); //设置文字描述内容
iamgeDesc.setText(imageDescriptions[position]); //改变指示点的状态
//把当前点enbale 为true
pointGroup.getChildAt(position).setEnabled(true);
//把上一个点设为false
pointGroup.getChildAt(lastPosition).setEnabled(false);
lastPosition = position; } @Override
/**
* 页面正在滑动的时候,回调
*/
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
} @Override
/**
* 当页面状态发生变化的时候,回调
*/
public void onPageScrollStateChanged(int state) { }
});

实现自动播放

实现循环有以下几种方法

自动循环:

1、定时器:Timer

2、开子线程 while true 循环

3、ColckManager

4、 用handler 发送延时信息,实现循环

这里采用第四种

在onCreate方法中

         isRunning = true;
handler.sendEmptyMessageDelayed(0, 2000);

定义handler

/**
* 判断是否自动滚动
*/
private boolean isRunning = false; private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) { //让viewPager 滑动到下一页
viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
if(isRunning){
handler.sendEmptyMessageDelayed(0, 2000);
}
};
}; protected void onDestroy() { isRunning = false;
};

另外,关于layoutParams 的一些小知识

//添加指示点
ImageView point =new ImageView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.rightMargin = 20;
point.setLayoutParams(params);
point.setBackgroundResource(R.drawable.point_bg);

当元素是在LinearLayout中时,就要用LinearLayout.LayoutParams,在relativeLayout中时,就要用relativeLayout.LayoutParams

实现效果

Android之自定义控件入门的更多相关文章

  1. android 开发从入门到精通

    Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...

  2. Android中自定义控件TextSize属性问题

    本文主要说明一个自定义控件添加TextSize属性的坑,刚刚从坑里面爬出来,写个随笔,记录一下: *************************************************** ...

  3. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  4. Android Studio单元测试入门

    Android Studio单元测试入门 通常在开发Android app的时候经常会写一些小函数并验证它是否运行正确,通常做法我们是把这个函数放到某个界面(Activity上)执行一下,运行整个工程 ...

  5. 下面就介绍下Android NDK的入门学习过程(转)

    为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库 ...

  6. Android渗透测试Android渗透测试入门教程大学霸

    Android渗透测试Android渗透测试入门教程大学霸 第1章  Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...

  7. 一看就懂的Android APP开发入门教程

    一看就懂的Android APP开发入门教程 作者: 字体:[增加 减小] 类型:转载   这篇文章主要介绍了Android APP开发入门教程,从SDK下载.开发环境搭建.代码编写.APP打包等步骤 ...

  8. (转)Android: NDK编程入门笔记

    转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...

  9. Android Wear 开发入门

    大家好,我是陆嘉杰,我是一名Android开发者.我想和大家进行一些技术交流,希望越来越多的人能和我成为好朋友. 大家都知道,智能手表是下一个开发的风口,而这方面的技术又属于前沿,所以和大家分享下An ...

随机推荐

  1. HD2157How many wasy??(十大矩阵问题之八 + 邻接矩阵的应用)

    How many ways?? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. Centos是什么

    Linux是GNU/Linux的缩写,通常指各种Linux发行版的通称. 常见的Linux厂家主要有Redhat/Novell等. Redhat有两大Linux产品系列,其一是免费的Fedora Co ...

  3. 锋利的jQuery-5--下拉框的应用(看写法)

    如图,可以通过中间的按钮将左边选中的选项添加到右边,或者全部添加到右边,也可通过双击添加.反之也可以. 左边选中加到右边: $("#add").click(function(){ ...

  4. memcache的内存回收机制

    memcache不会释放内存,而是重新利用. 在缓存的清除方面,memcache是不释放已分配内存.当已分配的内存所在的记录失效后,这段以往的内存空间,memcache只会重复利用. memcache ...

  5. TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

    /** * * @author ocq */ class Parent implements Comparable { private int age = 0; public Parent(int a ...

  6. [整理]Web应用安全学习

    最近在复习TCP/IP相关知识,同时也想对网络安全相关的知识进行系统的补漏. 阅读了一些常见的关于XSS.CSRF等的一些网上文章: http://www.cnblogs.com/luminji/ca ...

  7. There are no interfaces on which a capture can be done.

    There are no interfaces on which a capture can be done. 今天启动了Wireshark 但是提示→There are no interfaces ...

  8. hibernate中的session缓存

    1.什么是session缓存? 在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 且没有 ...

  9. 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.

    在网上看到过一个面试题,感觉挺有意思,看别人的代码写的逻辑不够谨慎,重写了一个,较真了又... package com.array7.algorithm; public class Algorithm ...

  10. error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不匹配值“2”

    error: vtkCommon.lib(vtkSmartPointerBase.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不 ...