`
johnnycmj
  • 浏览: 37047 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

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();
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		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_seleted_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(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"};

	@Override
	protected 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() {

			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int arg2, long arg3) {
				// TODO Auto-generated method stub
				textView.setText(titles[arg2]);
				myView.setSeletion(arg2);
			}

			@Override
			public 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;
		}
		
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return res.length;
		}

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

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			if(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 {
		@Override
		public void run() {
			mHandler.sendEmptyMessage(SCROLL_ACTION);
		}
	}
	
	Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.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;

}
 
  • 大小: 258.3 KB
分享到:
评论

相关推荐

    android-viewflow

    And then you'll need to connect your ViewFlow with the FlowIndicator: CircleFlowIndicator indic = (CircleFlowIndicator) findViewById(R.id.viewflowindic); viewFlow.setFlowIndicator(indic); By default,...

    C语言基础语法与程序设计入门讲解

    c语言入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进入编程世界的必修课。hello,world #include<stdio.h>  int main() {     /*在双引号中间输入Hello World*/      printf("Hello World");     return 0;  } 注:在最新的C标准中,main函数前的类型为int而不是void c语言的具体结构简单来说,一个C程序就是由若干头文件和函数组成。#include <stdio.h>就是一条预处理命令, 它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作。函数就是实现代码逻辑的一个小的单元。必不可少之主函数一个C程序有且只有一个主函数,即main函数。C程序就是执行主函数里的代码,也可以说这个主函数就是C语言中的唯一入口。而main前面的int就是主函数的类型.printf()是格式输出函数,这里

    部门绩效考核表模板(基于KPI,以月度为例1).xlsx

    部门绩效考核表模板(基于KPI,以月度为例1)

    基于YOLOv5的移动机器人动态视觉SLAM算法研究.pdf

    基于YOLOv5的移动机器人动态视觉SLAM算法研究.pdf

    基于二阶锥优化的电气综合能源系统协调调度策略研究与仿真-利用MATLAB及CPLEX平台精准求解,MATLAB代码:基于二阶锥优化电气综合能源系统优化调度研究 关键词:电气综合能源 优化调度 二阶锥

    基于二阶锥优化的电气综合能源系统协调调度策略研究与仿真——利用MATLAB及CPLEX平台精准求解,MATLAB代码:基于二阶锥优化电气综合能源系统优化调度研究 关键词:电气综合能源 优化调度 二阶锥优化 参考文档:《考虑气电联合需求响应的气电综合能源配网系统协调优化运行_刘天琪》参考部分配电网设备模型,非完全复现,具体以店主自写文档为准 仿真平台:MATLAB+CPLEX 平台 优势:代码具有一定的深度和创新性,注释清晰,非烂大街的代码,非常精品 主要内容:代码主要做的是电气综合能源系统的优化调度策略,气网部分和电网部分的相关约束都通过二阶锥或者其他线性化的方法进行化简,模型清晰且容易求解,经过化简后采用CPLEX实现求解,可以在此基础上扩加储能、SVG、OLTC以及电容器等相关设备,升级版的程序店主也有,该代码适合新手学习以及在此基础上进行拓展,代码质量非常高,保姆级的注释以及人性化的模块子程序,所有数据均有可靠来源 ,基于二阶锥优化的电气综合能源系统优化调度MATLAB代码研究

    春节文化主题活动策划与作文素材集锦

    春节主题作文素材 初中语文主题学习 2025年01月21日 20:26 山西 写年味 开头:新年的脚步渐近,街头巷尾瞬间被年味填满。大红灯笼高高挂起,恰似熟透的红柿子,在风中轻晃,透着喜庆。街边店铺张贴着崭新春联,墨香在空气中氤氲。年货摊前人头攒动,吆喝声、谈笑声交织。孩子们手持糖葫芦,欢笑着穿梭其中,那鲜艳糖衣与红彤彤脸蛋相映,年味愈发浓郁,似要将寒冬暖化 。 结尾:置身这浓烈年味里,我沉醉不已。它是团圆温馨,是对过往的怀念、对未来的期许。当烟花在夜空绽放,那光亮如同希望之火。愿这份年味永不消散,伴我们走过岁岁年年,让温暖与幸福在生活中延续 。 满分作文题目: 《灯火映新岁,年味满人间》 《街头巷尾,年味悠长》 《大红灯笼,摇曳年味时光》 《墨香春联,晕染年味画卷》 《糖葫芦串起的年味》 开头:记忆深处,年味是外婆手中的剪纸。每至腊月,外婆便戴上老花镜,坐在暖阳下,手中红纸在剪刀下翻转,不一会儿,栩栩如生的花鸟鱼虫便跃然纸上。她脸上慈祥笑容,和着剪纸独特艺术魅力,成为我对年味最初印象。如今,外婆已年迈,可那份年味记忆,从未淡去 。 结尾:重拾外婆剪纸,往昔春节场景浮现

    dbeaver离线安装版 (数据库管理工具dbeaver-ce-23离线驱动+安装包+使用说明) 内置sqlserver、mysql、oracle、opengauss数据库 可满足日常使用

    dbeaver离线安装版。(数据库管理工具dbeaver-ce-23离线驱动+安装包+使用说明) 内置sqlserver、mysql、oracle、opengauss数据库。可满足日常使用。

    基于LEBERT-CRF和知识图谱的中文地址修正补全方法.pdf

    基于LEBERT-CRF和知识图谱的中文地址修正补全方法.pdf

    (最新!!)1997-2022年《中国教育经费统计年鉴》合集

    比较全面、系统地反映了历年全国教育经费来源和使用的情况,为国家和地方编制教育发展规划制定教育财政政策提供了重要的参考依据。它对于研究教育经费结构和使用效益有一定价值对于各地之间的情况交流,提高教育财务管理水平,也将会起到促进作用。 全国教育经费统计资料的各项数据是从最基层单位开始填报,经过乡(镇)、县(市、区)、地(市)、省(自治区、直辖市)等教育主管部门层层汇总的。

    apache-commons-lang-javadoc-2.6-15.el7.x64-86.rpm.tar.gz

    1、文件内容:apache-commons-lang-javadoc-2.6-15.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/apache-commons-lang-javadoc-2.6-15.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    基于向量特征的车辆轨迹预测.pdf

    基于向量特征的车辆轨迹预测.pdf

    apache-rat-plugin-0.8-13.el7.x64-86.rpm.tar.gz

    1、文件内容:apache-rat-plugin-0.8-13.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/apache-rat-plugin-0.8-13.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    2023年全国大学生英语竞赛样题(C类).pdf

    2023年全国大学生英语竞赛样题(C类)

    惯导里程计GPS组合导航算法下的卡尔曼滤波matlab代码实现与性能优化,惯导里程计GPS组合导航算法,matlab代码卡尔曼滤波 ,核心关键词:惯导里程计; GPS组合导航算法; 导航算法; MAT

    惯导里程计GPS组合导航算法下的卡尔曼滤波matlab代码实现与性能优化,惯导里程计GPS组合导航算法,matlab代码卡尔曼滤波 ,核心关键词:惯导里程计; GPS组合导航算法; 导航算法; MATLAB代码; 卡尔曼滤波。,"基于Matlab的惯导里程计与GPS组合导航算法的卡尔曼滤波实现"

    2023年全国大学生英语竞赛样题(C类)样题答案及听力原文.pdf

    2023年全国大学生英语竞赛样题(C类)样题答案及听力原文

    ant-apache-log4j-1.9.4-2.el7.x64-86.rpm.tar.gz

    1、文件内容:ant-apache-log4j-1.9.4-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ant-apache-log4j-1.9.4-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    44 -生产车间主任绩效考核表1.xlsx

    44 -生产车间主任绩效考核表1

    aarch64交叉编译的valgrind-3.24.0版本

    交叉编译工具:aarch64-linux valgrind软件版本:3.24.0 使用时添加环境变量: export VALGRIND_LIB=/opt/aarch64_build/libexec/valgrind export PATH="/opt/aarch64_build/bin":$PATH

    01-【标准制度】绩效考核体系(附全套流程).docx

    01-【标准制度】绩效考核体系(附全套流程)

    酒店前厅客房主管晋升考核表.xlsx

    酒店前厅客房主管晋升考核表

Global site tag (gtag.js) - Google Analytics