ExpandableListView+gallery+自定义view

前段时间在网上看到一个ExpandableListView与gallery相关的例子,感觉做的很不错;自己借用过来做了些许修改,实现了gallery借助手势onFling()方法实现左右自动滑动并带动自定义的view:

 

package com.qiyi.test;


import java.util.Timer;
import java.util.TimerTask;

import com.qiyi.R;
import com.qiyi.view.FlowView;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;

public class QHomeActivity extends Activity {

	private ExpandableListView expandableListView;
	public String[] groups = new String[]{"一月影视","二月影视","三月影视","四月影视"};
	public String[][] childs = new String[4][2];
	public int[] tags = new int[]{0,0,0,0};//用来标示每个组展开与收缩
	public int[] galleryImage = new int[]{R.drawable.test1, R.drawable.test2,
			R.drawable.test3, R.drawable.test1, R.drawable.test2,
			R.drawable.test3, R.drawable.test1, R.drawable.test2,
			R.drawable.test3};
	private ExpandableAdapter adapter;
	private View headerView;
	private Gallery gallery;
	private GalleryAdapter galleryAdapter;
	private FlowView flowView;
	private Timer timer;
	private static final int MSG_SEND1 = 0;
	private static final int MSG_SEND2 = 1;
	private int index_flag_gallery = 0;//gallery滑动方向索引标志位 0:向右 1:向左
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.q_home);
		initView();
		timer = new Timer();
		timer.scheduleAtFixedRate(new MyTask(), 0, 5000);
	}
	private class MyTask extends TimerTask{
		@Override
		public void run() {
			if(index_flag_gallery == 0){
				
				handler.sendEmptyMessage(MSG_SEND1);
			}else{
				handler.sendEmptyMessage(MSG_SEND2);
			}
		}
	}
	Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case MSG_SEND1://通过手势自动滑动gallery
				MotionEvent e1 = MotionEvent.obtain(SystemClock.uptimeMillis(),
						SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN,
						89.333336f, 265.33334f, 0);
				MotionEvent e2 = MotionEvent.obtain(SystemClock.uptimeMillis(),
						SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,
						300.0f, 238.00003f, 0);

				gallery.onFling(e1, e2, -1300, 0);
				break;
			case MSG_SEND2:
				MotionEvent e11 = MotionEvent.obtain(SystemClock.uptimeMillis(),
						SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN,
						300.0f, 238.00003f, 0);
				MotionEvent e22 = MotionEvent.obtain(SystemClock.uptimeMillis(),
						SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,
						89.333336f, 265.33334f, 0);

				gallery.onFling(e11, e22, 1300, 0);
				break;

			default:
				break;
			}
		};
	};
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
	}
	private void initView(){
		expandableListView = (ExpandableListView) findViewById(R.id.expandableListView1);
		adapter = new ExpandableAdapter(this);
		headerView = LayoutInflater.from(this).inflate(R.layout.q_header_view, null);
		
		gallery = (Gallery) headerView.findViewById(R.id.home_gallery);
		galleryAdapter = new GalleryAdapter(this);
		gallery.setAdapter(galleryAdapter);
		
		flowView = (FlowView) headerView.findViewById(R.id.myView);
		flowView.setCount(galleryAdapter.getCount());
		
		gallery.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				flowView.setSeletion(position);
				if(position == 0){
					index_flag_gallery = 0;
				}else if(position == flowView.getCount()-1){
					index_flag_gallery = 1;
				}
			}

			@Override
			public void onNothingSelected(AdapterView<?> parent) {
				// TODO Auto-generated method stub
				
			}
		});
		
		expandableListView.addHeaderView(headerView);
		expandableListView.setAdapter(adapter);
		
		//展开
		expandableListView.setOnGroupExpandListener(new OnGroupExpandListener() {
			
			@Override
			public void onGroupExpand(int groupPosition) {
				tags[groupPosition] = 1;
				//只展开一项
				for(int i=0 ;i<groups.length;i++){
					if(groupPosition != i){
						expandableListView.collapseGroup(i);
					}
				}
			}
		});
		//收缩
		expandableListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
			
			@Override
			public void onGroupCollapse(int groupPosition) {
				tags[groupPosition] = 0;
			}
		});
	}
	/**
	 * gallery adapter
	 * @author Administrator
	 *
	 */
	private class GalleryAdapter extends BaseAdapter{

		private Context context;
		public GalleryAdapter(Context ctx){
			this.context = ctx;
		}
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return galleryImage.length;
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return galleryImage[position];
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if(convertView == null){
				convertView = LayoutInflater.from(context).inflate(R.layout.gallery_item, null);
			}
			ImageView imageView = (ImageView) convertView.findViewById(R.id.home_img);
			imageView.setImageResource(galleryImage[position]);
			return convertView;
		}
		
	}
	/**
	 * 二级下拉列表adapter
	 * @author Administrator
	 *
	 */
	private class ExpandableAdapter extends BaseExpandableListAdapter{

		private Context context;
		public ExpandableAdapter(Context ctx){
			this.context = ctx;
			for(int i = 0 ;i < 4;i++){
				for(int j = 0;j < 2;j++){
					childs[i][j] = "child" + i + "_" + j;
				}
			}
		}
		@Override
		public Object getChild(int groupPosition, int childPosition) {
			// TODO Auto-generated method stub
			return childs[groupPosition][childPosition];
		}

		@Override
		public long getChildId(int groupPosition, int childPosition) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public View getChildView(int groupPosition, int childPosition,
				boolean isLastChild, View convertView, ViewGroup parent) {
			if(convertView == null){
				convertView = LayoutInflater.from(context).inflate(R.layout.child_item, null);
			}
			return convertView;
		}

		@Override
		public int getChildrenCount(int groupPosition) {
			// TODO Auto-generated method stub
			return childs[groupPosition].length;
		}

		@Override
		public Object getGroup(int groupPosition) {
			// TODO Auto-generated method stub
			return groups[groupPosition];
		}

		@Override
		public int getGroupCount() {
			// TODO Auto-generated method stub
			return groups.length;
		}

		@Override
		public long getGroupId(int groupPosition) {
			// TODO Auto-generated method stub
			return groupPosition;
		}

		@Override
		public View getGroupView(int groupPosition, boolean isExpanded,
				View convertView, ViewGroup parent) {
			GroupHolder groupHolder = null;
			if(convertView == null){
				groupHolder = new GroupHolder();
				convertView = LayoutInflater.from(context).inflate(R.layout.group_item, null);
				groupHolder.imageView = (ImageView) convertView.findViewById(R.id.tag_img);
				groupHolder.title = (TextView) convertView.findViewById(R.id.title_view);
				
				convertView.setTag(groupHolder);
			}else{
				groupHolder = (GroupHolder) convertView.getTag();
			}
			if(tags[groupPosition] == 0){
				groupHolder.imageView.setImageResource(R.drawable.list_indecator_button);
			}else{
				groupHolder.imageView.setImageResource(R.drawable.list_indecator_button_down);
			}
			groupHolder.title.setText(groups[groupPosition]);
			return convertView;
		}

		@Override
		public boolean hasStableIds() {
			// TODO Auto-generated method stub
			return true;
		}

		@Override
		public boolean isChildSelectable(int groupPosition, int childPosition) {
			// TODO Auto-generated method stub
			return true;
		}
		class GroupHolder{
			ImageView imageView;
			TextView title;
		}
	}
}

 下面是自定义的view:

package com.qiyi.view;


import com.qiyi.R;

import android.R.integer;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class FlowView extends View{

	private int count;
	private float space,radius;
	private int point_normal_color,point_selected_color;
	//选中
	private int seleted = 0;
	
	public FlowView(Context context, AttributeSet attrs) {
		super(context, attrs);
		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlowViewStyle);
		
		count = a.getInteger(R.styleable.FlowViewStyle_count, 4);
		space = a.getDimension(R.styleable.FlowViewStyle_space, 9);
		radius = a.getDimension(R.styleable.FlowViewStyle_point_radius, 9);
		
		point_normal_color = a.getColor(R.styleable.FlowViewStyle_point_normal_color, 0x000000);
		point_selected_color = a.getColor(R.styleable.FlowViewStyle_point_seleted_color, 0xffff07);
		
		int sum = attrs.getAttributeCount();
		/*if(true){
			String str = "";
			for(int i=0;i<sum;i++){
				String name = attrs.getAttributeName(i);
				String value = attrs.getAttributeValue(i);
				str += "attr_name:" + name + ": " + value + "\n";
			}
		}*/
		a.recycle();
	}

	public void setSeletion(int index){
		this.seleted = index;
		invalidate();
	}
	public void setCount(int count){
		this.count = count;
		invalidate();
	}
	public int getCount(){
		return count;
	}
	public void next(){
		if(seleted < count - 1){
			seleted++;
		}else{
			seleted = 0;
		}
		invalidate();
	}
	public void previous(){
		if(seleted > 0){
			seleted --;
		}else{
			seleted = count - 1;
		}
		invalidate();
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		Paint paint = new Paint();
		paint.setAntiAlias(true);
		float width = (getWidth() - ((radius*2*count) + (space*(count-1))))/2.f;
		for(int i=0;i < count;i++){
			if(i == seleted){
				paint.setColor(point_selected_color);
			}else{
				paint.setColor(point_normal_color);
			}
			canvas.drawCircle(width + getPaddingLeft() + radius + i
					* (space + radius + radius), getHeight() / 2, radius, paint);
		}
	}
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		//裁定绘制图样的区域
		setMeasuredDimension(measureWith(widthMeasureSpec), measureHeight(heightMeasureSpec));
	}
	private int measureWith(int measureSpec){
		int result = 0;
		int specMode = MeasureSpec.getMode(measureSpec);
		int specSize = MeasureSpec.getSize(measureSpec);
		if(specMode == MeasureSpec.EXACTLY){
			result = specSize;
		}else{
			result = (int)(getPaddingLeft()+getPaddingRight()+(count*2*radius)+(count-1)*radius+1);
		}
		return result;
	}
	private int measureHeight(int measureSpec) {
		int result = 0;
		int specMode = MeasureSpec.getMode(measureSpec);
		int specSize = MeasureSpec.getSize(measureSpec);

		if (specMode == MeasureSpec.EXACTLY) {
			result = specSize;
		} else {
			result = (int) (2 * radius + getPaddingTop() + getPaddingBottom() + 1);
			if (specMode == MeasureSpec.AT_MOST) {
				result = Math.min(result, specSize);
			}
		}
		return result;
	}
}

 用于指定自定义view的属性的xml文件(values目录下):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="FlowViewStyle">
      <attr name="count" format="integer"/>
      <attr name="space" format="dimension"/>
      <attr name="point_size" format="dimension"/>
      <attr name="point_seleted_color" format="color|reference"/>
      <attr name="point_normal_color" format="color|reference"/>
      <attr name="point_radius" format="dimension"/>
    </declare-styleable>
</resources>

 选择样式文件(values目录下):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="transparent">#00000000</drawable>
</resources>

 

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/transparent" android:state_expanded="true"></item>
    <item android:drawable="@drawable/transparent"></item>
</selector>

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
    <include layout="@layout/title_view"/>
    <ExpandableListView android:id="@+id/expandableListView1" 
                        android:layout_height="wrap_content" 
                        android:layout_width="fill_parent"
                        android:groupIndicator="@drawable/tag_but_background">
    </ExpandableListView>
    
</LinearLayout>

 

 

 

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

    xmlns:app="http://schemas.android.com/apk/res/com.qiyi"

    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

   <Gallery android:id="@+id/home_gallery"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:spacing="5dip"/>
   <LinearLayout android:id="@+id/linearLayout1" 
                 android:layout_width="fill_parent" 
                 android:layout_height="wrap_content" 
                 android:layout_gravity="bottom"
                 android:orientation="vertical"
                 android:background="#65000000">
       <TextView android:text="好影视,一网打尽" 
                 android:id="@+id/textView1" 
                 android:layout_width="wrap_content" 
                 android:layout_height="wrap_content"
                 android:layout_gravity="center"
                 android:layout_marginBottom="5dip"
                 android:layout_marginTop="5dip"
                 android:textColor="#ffffff"
                 android:textSize="18dip">
       </TextView>
       <com.qiyi.view.FlowView
         android:id="@+id/myView"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_marginBottom="5dip"
         app:count="4"
         android:gravity="center"
         app:point_normal_color="#45000000"
         app:point_radius="3dip"
         app:point_seleted_color="#ffffff"
         app:point_size="5dip"
         app:space="10dip">
       </com.qiyi.view.FlowView>
   </LinearLayout>
</FrameLayout>

 

你可能感兴趣的:(ExpandableListView+gallery+自定义view)