zoukankan      html  css  js  c++  java
  • 自定义控件实现广告头自动移动,viewpager的运用,和自己利用xml画图,自定义圆点,构造选择器的方法

    1、viewpager在广告头里经常运用到,它是android3后出现的控件,在因此在添加的时候android.support.v4.view.ViewPager.class里,因此在xml定义的时候需要加全名称,同时注意不要后缀名class。下面从demo里学习viewpager的运用。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"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.viewdemo.MainActivity$PlaceholderFragment" 
        android:background="@android:color/darker_gray"
        >
    
        <android.support.v4.view.ViewPager
             android:id="@+id/img_view"
            android:layout_width="fill_parent"
            android:layout_height="200dp"
            />
            
        <!-- 这里background设置后6位为rgb的值,前面是透明度参数,33为半透明 -->
        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:background="#33000000"
            android:layout_alignBottom="@+id/img_view"
            >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:textColor="@android:color/white"
                android:paddingTop="5dp"
                android:id="@+id/title"
                 />
            
            <!-- 这里定义一个空的线性布局,在代码里加入点的ui ,
            注意gravity的运用是在容器里控件的排列,用于ui是ui在它布局里的排列-->
            <LinearLayout 
                android:id="@+id/dians"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center_horizontal"
                android:paddingBottom="10dp"
                android:layout_marginTop="2dp"
                >
            </LinearLayout>
        </LinearLayout>
        
    
    </RelativeLayout>
    

      2、java的activity代码:

    public class MainActivity extends Activity {
    	private ViewPager viewpager;
    	private ArrayList <ImageView> imageviews;
    	private int number;
    	private View[] points;
    	private LinearLayout dians;
    	private String[] titles;
    	private TextView title;
    	private boolean flag=true;//标识应用程序是否为可见
    	
    	public  Handler handler=new Handler(){
    
    		@Override
    		public void handleMessage(Message msg) {
    			int a=msg.what;
    			points[a].setEnabled(true);
    			a++;
    			int c=a%number;
    			viewpager.setCurrentItem(c);
    			title.setText(titles[c]);
    			points[c].setEnabled(false);
    			super.handleMessage(msg);
    		}
    		
    		
    	};
    	
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            dians=(LinearLayout) findViewById(R.id.dians);
            title=(TextView) findViewById(R.id.title);
            number=5;
            initview();
            viewpager.setOnPageChangeListener(new PagerLisetner());
            setpointsOnclick();
            
            Thread pagermove=new Thread(new ThreadpageChange());
            pagermove.start();
            
            
        }
        
        class  ThreadpageChange implements Runnable
        {
    
    		@Override
    		public void run() {
    			
    			while(true){
    			
    				synchronized (MainActivity.class) {
    					if(flag){
    			try {
    				Thread.sleep(2000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			int a=viewpager.getCurrentItem();
    			Message msg=new Message();
    			msg.what=a;
    			handler.sendMessage(msg);
    					} else
    						try {
    							MainActivity.class.wait();
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    				}
    			}
    		}
        	
        }
       //页面改变监听器 
    class PagerLisetner implements OnPageChangeListener
    {
    
    	@Override
    	public void onPageScrollStateChanged(int arg0) {
    		
    	}
    
    	@Override
    	public void onPageScrolled(int arg0, float arg1, int arg2) {
    			
    	}
    
    	@Override
    	public void onPageSelected(int arg0) {
    		
    		title.setText(titles[arg0]);
    		for(int x=0;x<number;x++ )
    		{
    			View v=dians.getChildAt(x);
    			if(x==arg0)
    				v.setEnabled(false);
    			else
    				v.setEnabled(true);
    		}
    		
    	}
    	
    }
    //设置点被点击的监听器
     public void setpointsOnclick()
    {
    	for(int x=0;x<number;x++)
    	{
    		
    		View v=points[x];
    		v.setTag(x);
    		v.setOnClickListener(new PointOnclickLinstener());
    	}
    }
    //点被点击的监听器
     class PointOnclickLinstener implements OnClickListener
    		{
    			@Override
    			public void onClick(View v) {
    				System.out.println("点击了。。。"+v.getTag());
    				int index=(Integer) v.getTag();
    				title.setText(titles[index]);
    				points[index].setEnabled(true);
    				viewpager.setCurrentItem(index);
    			}
    		}
     //初始化界面   
    public void initview()
        {
    	//将每张图片创建一个Imgeview,并存起来
        	int[] images={
        			R.drawable.a,
        			R.drawable.b,
        			R.drawable.c,
        			R.drawable.d,
        			R.drawable.e
        	};
        	imageviews=new ArrayList<ImageView>();
        	for(int i=0;i<number;i++)
        	{
        		ImageView im=new ImageView(this);
        		im.setBackground(getResources().getDrawable(images[i]));
        		imageviews.add(im);
        	}
        	
        	 viewpager=(ViewPager) findViewById(R.id.img_view);
             viewpager.setAdapter(new VpAdapter());
        	//添加点
        	addpoints();
        	//初始化标题
        	addTitle();
        	title.setText(titles[0]);
        	points[0].setEnabled(false);
        	
        }
    //添加点
    public void addpoints()
    {
    	points=new View[number];
    	for(int i=0;i<number;i++)
        {
         View v=new View(this);
         //创建子视图
         LayoutParams pa=new LayoutParams(8, 8);
         pa.leftMargin=10;
         v.setLayoutParams(pa);//使点按照子视图格式形成view
         v.setBackgroundResource(R.drawable.bg);//设置点的背景,这里的bg是选择器,下面介绍
         v.setEnabled(true);
        //将创建的子视图点添加到LinearLayout中
         points[i]=v;
         dians.addView(v);
        }
    }
    
    //添加标题
    public void addTitle()
    {
    	titles=new String[]{
    		"巩俐不低俗,我就不能低俗",
    		"朴树邮回来啦!唱经典老歌引万人大合唱",
    		"揭秘北京电影如何升级",
    		"乐视网TV版大派送",
    		"热血屌丝的反杀"
    	};
    	
    }
    
    class VpAdapter extends PagerAdapter
    {
    
    	@Override
    	public Object instantiateItem(ViewGroup container, int position) {
    		
    		viewpager.addView(imageviews.get(position));
    		
    		return imageviews.get(position);
    	}
    	@Override
    	public void destroyItem(ViewGroup container, int position, Object object) {
    		//从右向左划就删除当前页,从右往左就加,即执行instantiateItem,当1时候一下跳到5时,其实add了前面4个(仅我的看法)
    		viewpager.removeView(imageviews.get(position));
    	}
    	@Override
    	public int getCount() {
    		return imageviews.size();
    	}
    
    	@Override
    	public boolean isViewFromObject(View arg0, Object arg1) {
    		return arg0==arg1;
    	}
    	
    }
    
    //重写下面activity生命周期是当程序后台时为了将资源消耗,让子线程等待
    @Override
    protected void onResume() {
    		if(!flag)
    		MainActivity.class.notify();
    	super.onResume();
    }
    @Override
    protected void onPause() {
    	flag=false;
    	super.onPause();
    }
    
    }
    

      3、下面介绍如何在xml文件里画图的,首先给出我的工程目录:

     

    可以看出,文件里定义了dian_normal,和dian_select,这是点在被选择和没有被选择的时候的图像,bg其实就是这两种图像的选择器,当可点击时候选normal,不可点击时候显示select。画图是在drawable里选择shape,然后再里面可以画几种简单的形状:

    normal的xml文件:android:shape=oval是指画圆,下面的corners 里radius是圆半径、solid是填充颜色。

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="oval">
        <corners 
            android:radius="0.5dp"
            />
            <solid 
                android:color="@android:color/background_dark"
                />   
    </shape>
    

      select的xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="oval">
        <corners 
            android:radius="0.5dp"
            />
            <solid 
                android:color="@android:color/white"
                />
    </shape>
    

      下面是选择器:db.xml,即当enable=true时候选择一种drawable,false时候选择另一个

    <?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/dian_select"></item>
    	<item android:state_enabled="true" android:drawable="@drawable/dian_normal"></item>
    </selector>
    

      

  • 相关阅读:
    hdu 4947
    hdu 4946
    hdu 4944
    hdu 4942
    hdu 4941
    PAT 【L2-011 玩转二叉树】
    PAT【L2-006 树的遍历】
    XYNUOJ 【2070: 重建二叉树】
    XYNUOJ 【1367: 二叉链表存储的二叉树】
    XYNUOJ 2390【二叉树遍历2】
  • 原文地址:https://www.cnblogs.com/bokeofzp/p/4764719.html
Copyright © 2011-2022 走看看