FlowIndicator 自定义左右图片切换
?二、布局文件
header_view.xml
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app1="http://schemas.android.com/apk/res/com.johnny.flowindicatortest" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <Gallery android:id="@+id/home_gallery" android:layout_width="fill_parent" android:layout_height="wrap_content" android:spacing="5dp" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:background="#65000000" android:orientation="vertical" > <TextView android:id="@+id/tv_gal_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dp" android:layout_marginTop="5dp" android:textColor="#ffffff" android:textSize="18sp" /> <com.johnny.flowindicatortest.FlowIndicator android:id="@+id/myview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="5dip" android:gravity="center" app:count="4" app:point_normal_color="#45000000" app:point_radius="3dip" app:point_seleted_color="#ffffff" app:point_size="5dip" app:space="10dp" /> </LinearLayout></FrameLayout>
gallery_item.xml
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/home_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:src="@drawable/t1" /></FrameLayout>
?
一个资源文件attrs.xml<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="FlowIndicator"> <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>?FlowIndicator.java
public class FlowIndicator extends View {private int count;private float space, radius;private int point_normal_color, point_seleted_color;// 选中private int seleted = 0;public FlowIndicator(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub//提供TypedArray(用于Drawable对象数组)的XML资源。TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.FlowIndicator);count = typedArray.getInteger(R.styleable.FlowIndicator_count,4);space = typedArray.getDimension(R.styleable.FlowIndicator_space, 9);radius = typedArray.getDimension(R.styleable.FlowIndicator_point_radius, 9);point_normal_color = typedArray.getColor(R.styleable.FlowIndicator_point_normal_color, 0x000000);point_seleted_color = typedArray.getColor(R.styleable.FlowIndicator_point_seleted_color, 0xffff07);int sum = attrs.getAttributeCount();if(Constans.DEBUG){String str = "";for(int i=0;i<sum;i++){String name = attrs.getAttributeName(i);String value = attrs.getAttributeValue(i);str += "sttr_name:" + name +": " + value +"\n";}Log.i("attribute", str);}typedArray.recycle();}public void setSeletion(int index){this.seleted = index;//重绘invalidate();}public void setCount(int count){this.count = count;invalidate();}public void next(){if(seleted < count-1){seleted++;}else{seleted = 0;}invalidate();}public void previous(){if(seleted > 0 ){seleted--;}else{seleted = count-1;}invalidate();}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.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_seleted_color);elsepaint.setColor(point_normal_color);canvas.drawCircle(width + getPaddingLeft() + radius + i* (space + radius + radius), getHeight() / 2, radius, paint);}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));}private int measureWidth(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);if (specMode == MeasureSpec.AT_MOST) {result = Math.min(result, specSize);}}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;}}?MainActivity.java
public class MainActivity extends Activity {private static final int SCROLL_ACTION = 0;private TextView textView;private Gallery mGallery;private FlowIndicator myView;Timer mTimer;private GalleryAdapter galleryAdapter;private String[] titles = {"标题1","标题2","标题3","标题4","标题5","标题6","标题7","标题8","标题9"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.header_view);viewInit();//定时滚动mTimer = new Timer();mTimer.scheduleAtFixedRate(new MyTask(), 0, 5000);}private void viewInit(){textView = (TextView) findViewById(R.id.tv_gal_title);mGallery = (Gallery) findViewById(R.id.home_gallery);myView = (FlowIndicator) findViewById(R.id.myview);galleryAdapter = new GalleryAdapter(this);myView.setCount(galleryAdapter.getCount());mGallery.setAdapter(galleryAdapter);mGallery.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {// TODO Auto-generated method stubtextView.setText(titles[arg2]);myView.setSeletion(arg2);}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {// TODO Auto-generated method stub}});}private class GalleryAdapter extends BaseAdapter{Context mContext;int[] res = new int[] { R.drawable.t1, R.drawable.t2,R.drawable.t3, R.drawable.t1, R.drawable.t2,R.drawable.t3, R.drawable.t1, R.drawable.t2,R.drawable.t3 };public GalleryAdapter(Context cnt) {this.mContext = cnt;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn res.length;}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn res[arg0];}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn arg0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubif(convertView == null){convertView = LayoutInflater.from(mContext).inflate(R.layout.gallery_item, null);}ImageView imageView = (ImageView) convertView.findViewById(R.id.home_img);imageView.setImageResource(res[position]);return convertView;}}private class MyTask extends TimerTask {@Overridepublic void run() {mHandler.sendEmptyMessage(SCROLL_ACTION);}}Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);switch (msg.what) {case SCROLL_ACTION: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);mGallery.onFling(e1, e2, -1300, 0);break;default:break;}}};}?Constans.java
public class Constans {public static boolean DEBUG = true;}?