-----------------------下面这个效果只是整个效果的第二步-(目前左右拖动图片+回弹效果)---一会继续更新博客-------------------------

配置文件

activity_main.xml(不解释,只有一个自定义控件)

[html] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <com.example.mscrollview.mScrollView
  6. android:id="@+id/msv"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent" />
  9. </RelativeLayout>

mScrollView.java

package com.example.mscrollview;import android.R.xml;
import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;public class mScrollView extends ViewGroup {//定义手势识别器private GestureDetector gestureDetector;//1、构造器public mScrollView(Context context, AttributeSet attrs) {super(context, attrs);initView(context);}/** 2、得到孩子页面的位置和大小*/@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {for (int i = 0; i < getChildCount(); i++) {//根据id得到孩子View childView = getChildAt(i);//布局每个页面的位置childView.layout(i*getWidth(), 0, getWidth()+getWidth()*i, getHeight());}}/** 初始化view*/private void initView(Context context) {//手势识别实例化gestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){//手指拖动调用该方法,e1代表按下,e2代表离开事件@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {//x轴y轴移动的距离scrollBy((int) distanceX, 0);//事件处理完毕return true;//scrollTo(x,y)要移动到的坐标上}});}/*** 接收事件onScroll*///记录起始坐标private float startX;//记录目前页面的索引位置private int currentIndex;@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);//执行父类方法,事件不会被拦截//接受事件gestureDetector.onTouchEvent(event);switch (event.getAction()) {//这个案例事件涉及到三种,按下、移动、离开case MotionEvent.ACTION_DOWN://只要一按下就记录起始坐标startX = event.getX();break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP://手指离开,记录新坐标float endX = event.getX();//计算偏移量if (endX-startX>getWidth()/2) {//上一个页面currentIndex --;}else if(startX - endX >getWidth()/2){//显示下一个页面currentIndex ++;}moveTo(currentIndex);break;default:break;}return true;}/** 根据当前页面索引,移动到对应的位置*/private void moveTo(int ScrolledIndex) {//屏蔽非法值如果移动到的页面缩影小于0就直接定位到第一张if (ScrolledIndex<0) {ScrolledIndex = 0;}//如果移动到的页码大于最后一张页面的索引,就定位到最后一张if (ScrolledIndex > getChildCount()-1) {ScrolledIndex = getChildCount()-1;}//将新的页面索引赋值给目前的页面索引值currentIndex = ScrolledIndex;//定位到某个坐标scrollTo(currentIndex*getWidth(), 0);}}

MainActivity.java(步骤都在注释里,简单明了,就是得到图片资源,得到自定义控件,将图片放到自定义控件里,因为自定义控件是继承Viewgroup,是一个组合,需要添加东西,ok? ok!)

[java] view plaincopy
  1. package com.example.mscrollview;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.ImageView;
  5. public class MainActivity extends Activity {
  6. // 1、图片资源
  7. private int[] ids = { R.drawable.a1, R.drawable.a2, R.drawable.a3,
  8. R.drawable.a3, R.drawable.a5, R.drawable.a6 };
  9. // 2、定义自定义控件
  10. private mScrollView msv;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. //创建自定义控件对象
  16. msv = (mScrollView) findViewById(R.id.msv);
  17. // 循环遍历6张图片,依次为图片对象添加背景图片,然后加入到msv自定义控件中
  18. for (int i = 0; i < ids.length; i++) {
  19. ImageView iv = new ImageView(this);
  20. iv.setBackgroundResource(ids[i]);
  21. //3、 添加子页面
  22. msv.addView(iv);
  23. }
  24. }
  25. }

自定义控件---继承ViewGroup类方式(循序渐进之第2步效果----图片左右拖动+自动回弹效果)相关推荐

  1. 自定义控件---继承ViewGroup类方式(循序渐进之第1步效果----图片左右拖动)

    -----------------------下面这个效果只是整个效果的刚开始-(目前只可以左右拖动图片)---一会继续更新博客------------------------- 配置文件 activ ...

  2. 自定义控件---继承ViewGroup类方式(循序渐进之第3步效果----图片左右拖动+RadioGroup切换效果)

    -----------------------下面这个效果只是整个效果的第三步-(目前左右拖动图片+回弹效果+RadioGroup切换效果)---一会继续更新博客------------------- ...

  3. 【Java多线程】实现Runnable接口方式 / 继承Thread类方式;使用synchronized锁实现线程安全;线程安全的懒汉式单例模式;死锁问题示例

    Thread 的生命周期 一.实现Runnable接口方式 1.在 run 方法中使用 synchronized 块 /*** 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的 ...

  4. 继承ViewGroup类

    Android中,布局都是直接或间接的继承自ViewGroup类,其中,ViewGroup的直接子类目前有: AbsoluteLayout, AdapterView<T extends Adap ...

  5. Android自定义控件----继承ViewGroup侧滑菜单5,抽屉式侧滑,QQ5.0效果(完结)

    效果图: 项目结构: QQ5.0的侧滑 和抽屉菜单的区别 简单的说就是在onScrollChanged方法中加入了缩放,偏移,渐变属性动画效果 区别1:内容1:内容区域 1.0到0.7 缩放效果 sc ...

  6. QT和MFC中怎么使用继承基类的自定义控件放置在界面上

    1.Qt中自定义button继承于QPushButton,f2查看指定控件的声明定义,可以手动改ui.form.h文件里各个类型的控件指针变量,改成自己定义的" (这里ui.form.h在工 ...

  7. 创建线程的两种方式:继承Thread类和实现Runnable接口

    第一种方式:继承Thread类 步骤:1.定义类继承Thread 2.覆写Threa类的run方法. 自定义代码放在run方法中,让线程运行 3.调用线程的star方法, 该线程有两个作用:启动线程, ...

  8. Java语言所有异常类均继承自_要继承自定义异常类的继承方式必须使用 ( ) 关键字_学小易找答案...

    [填空题]当异常已经被定义时,必须通过( ) 语句来处理它. [填空题]Catch 子句包含( )的程序段 [单选题]下列java语言的常用异常类中,属于检测异常的是() [单选题]自定义异常类时,可 ...

  9. java类注解是否可以通过实现接口或继承父类的方式获得

    接口类 @Service public interface UserService {public void get(); } 实现类 public class UserServiceImpl imp ...

最新文章

  1. 1.12 梯度的数值逼近-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  2. 【原】Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...
  3. UE4学习-场景介绍、基本操作、快捷键
  4. BITMAPINFO结构
  5. python中的计算符号
  6. 前端学习(2516):传值和引用
  7. 可以直接考甲级吗_函授本科可以考四级吗
  8. GStreamer基础教程04 - 动态连接Pipeline
  9. notebook python 已停止工作_Python/Jupyter Notebook初学遇到的一些问题总结(20201108)...
  10. Firefox下Add-ons推荐
  11. 透露一个未来3到5年的巨大商机
  12. Python检查模块
  13. NLP情感分析笔记(四):卷积情感分析
  14. centos5.5和6.5中vncservervncviewer最基本配置
  15. java实现身份证识别
  16. 长安链ChainMaker在线合约编辑器-SmartEditor
  17. 中望cad自定义快捷键命令_中望CAD快捷键汇总
  18. 马蜂窝视频编辑框架设计及在 iOS 端的业务实践
  19. 电梯轿厢内电动车自行车人数据集,VOC标签格式已标注
  20. Django——jinja2配置与使用

热门文章

  1. 后端再进阶一步,MySQL 优化学习第1天
  2. 【Windows + Linux】专业级:安装操作系统 + 多系统 + GhostCast Server PXE 网刻基础坑精通详解
  3. SAP HANA:下一代开放应用平台
  4. 创新易死需要勇气 需要抵御“抄袭”心魔
  5. DeFi基本概念-开发人员必看
  6. 学习笔记,梯度下降(非向量实现)
  7. 计算机网络管理技术参考文献,报文网络论文,关于计算机网络管理相关技术相关参考文献资料-免费论文范文...
  8. 第1章 持续交付2.0
  9. mapi java_Powershell从注册表中查询默认MAPI客户端的例子
  10. void在java中是什么意思_java中void什么意思