导航:首页 > 操作系统 > androidclickable

androidclickable

发布时间:2023-03-23 23:29:46

android自定义View——从零开始实现书籍翻页效果(一)

前言 :本篇是系列博客的第三篇,这次我们要研究 书籍翻页效果 。不知道大家平时有没用过iReader、掌阅这些小说软件,里面的翻页效果感觉十分的酷炫。有心想研究研究如何实现,于是网上找了找,发现这方面的教学资料非常少,所幸能找到 何明桂大大 的 Android 实现书籍翻页效果----原理篇 这样的入门博客(感谢大大 Orz),我们就以这篇博客为切入点从零实现我们自己的翻页效果。由于这次坑比较深,预计会写好几期,感兴趣的小伙伴可以点下关注以便及时收到更新提醒,谢谢大家的支持 ~

本篇只着重于思路和实现步骤,里面用到的一些知识原理不会非常细地拿来讲,如果有不清楚的api或方法可以在网上搜下相应的资料,肯定有大神讲得非常清楚的,我这就不献丑了。本着认真负责的精神我会把相关知识的博文链接也贴出来(其实就是懒不想写那么多哈哈),大家可以自行传送。为了照顾第一次阅读系列博客的小伙伴,本篇会出现一些在之前 系列博客 就讲过的内容,看过的童鞋自行跳过该段即可

国际惯例,先上效果图,本次主要实现了 基本的上下翻页效果 右侧最大翻页距离的限制

在看这篇博客之前,希望大家能先了解一下书籍翻页的实现原理,博客链接我已经贴出来了。通过原理讲解我们知道,整个书籍翻页效果界面分成了三个区域, A 为当前页区域, B 为下一页区域, C 为当前页背面,如图所示

书籍翻页效果的实现就是要以我们 触摸屏幕位置的坐标 为基础绘制出这三个区域,形成模拟翻页的特效。要绘制这三个区域,我们需要通过一组 特定的点 来完成,这些点的坐标需要通过两个已知的点( 触摸点 相对边缘角 )计算得到,下图我将各个特定点的位置和计算公式贴出来,大家对照着原理一起理解(渣画工望体谅 ╮(╯▽╰)╭ ),其中 b 点是由 ae cj 的交点, k 点是由 ah cj 的交点

简单总结一下, a 是触摸点, f 是触摸点相对的边缘角, eh 我们设置为 af 的垂直平分线,则 g af 的中点, ab ak dj 直线 曲线cdb 是起点为 c ,控制点为 e ,终点为 b 二阶贝塞尔曲线 曲线kij 是起点为 k ,控制点为 h ,终点为 j 二阶贝塞尔曲线 ,区域 A B C 就由这些点和线划分开来。我们将这些点称为标识点,下一步就是模拟设定 a f 点的位置,将这组标识点绘制到屏幕上来验证我们的计算公式是否正确,创建 BookPageView

实体类 MyPoint 用来存放我们的标识点坐标

界面布局:

在Activity中进行注册

效果如图

前文我们提到 ab ak dj 直线 曲线cdb 是起点为 c ,控制点为 e ,终点为 b 二阶贝塞尔曲线 曲线kij 是起点为 k ,控制点为 h ,终点为 j 二阶贝塞尔曲线 。通过观察分析得知, 区域A 是由View 左上角 左下角 曲线cdb , 直线 ab ak 曲线kij 右上角 连接而成的区域,修改 BookPageView ,利用 path 绘制处 区域A

效果如图

区域C 理论上应该是由点 a , b , d , i , k 连接而成的闭合区域,但由于 d i 是曲线上的点,我们没办法直接从 d 出发通过 path 绘制路径连接 b 点( i , k 同理),也就不能只用 path 的情况下直接绘制出 区域C ,我们需要用 PorterDuffXfermode 方面的知识“曲线救国”。我们试着先将点 a , b , d , i , k 连接起来,观察闭合区域与 区域A 之间的联系。修改 BookPageView

效果如图

我们将两条曲线也画出来对比观察

观察分析后可以得出结论, 区域C 由直线ab,bd,dj,ik,ak连接而成的区域 减去 与区域A交集部分 后剩余的区域。于是我们设置 区域C 画笔 Xfermode 模式为 DST_ATOP

效果如图

最后是 区域B ,因为 区域B 处于最底层,我们直接将 区域B 画笔 Xfermode 模式设为 DST_ATOP ,在 区域A、C 之后绘制即可,修改 BookPageView

效果如图

翻页可以从右下方翻自然也可以从右上方翻,我们将 f 点设在右上角,由于View上下两部分是呈 镜像 的,所以各标识点的位置也应该是镜像对应的,因为 区域B和C 的绘制与 f 点没有关系,所以我们只需要修改 区域A 的绘制逻辑,新增 getPathAFromTopRight() 方法

效果如图

之前由于测试效果没有对View的大小进行重新测量,在实现触摸翻页之前先把这个结了。重写View的 onMeasure() 方法

我们的需求是,在上半部分翻页时 f 点在右上角,在下半部分翻页时 f 则在右下角,当手指离开屏幕时回到 初始状态 ,根据需求,修改 BookPageView

在Activity中监听View的 onTouch 状态

注意,要设置 android:clickable true ,否则无法监听到 ACTION_MOVE ACTION_UP 状态

效果如图

到这里我们已经实现了基本的翻页效果,但要还原真实的书籍翻页效果,我们还需要设置一些限制条件来完善我们的项目

对于一般的书本来说,最左侧应该是钉起来的,也就是说如果我们从右侧翻页,翻动的距离是 有限制的 ,最下方翻页形成的曲线起点( c 点)的x坐标不能小于0(上方同理),按照这个限定条件,修改我们的 BookPageView

效果如图

至此本篇教程就告一段落了,当然还有许多功能需要继续完善,例如横向翻页、翻页动画、阴影效果等等,这些都会在后面的教程中一一解决。如果大家看了感觉还不错麻烦点个赞,你们的支持是我最大的动力~

⑵ android 如何实现图片选取框

在布局文件中建立一个linearlayout,设置为clickable,然后加入一个ImageView,这是布局文件 <LinearLayout android:orientation="vertical" android:layout_height="wrap_content" android:clickable="true" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content android:id="@+id/img" android:layout_gravity="center_horizontal" android:layout_centerVertical="true" android:src="@drawable/360"//这个是你的图标 /> </LinearLayout> 然后在做一个布局文件,加入也是...

⑶ android 控件xml属性

android : orientation     (horizontal/vertical)  设置布局水平还是垂直,默认是垂直  LinearLayout中使用

a ndroid : checked  (true/false) 标记默认选中,如果是单选则选中最后一个 RadioButton、CheckBox中使用

android: layout_gravity   (center/right/left/bottom/top) 父布局中的位置 

android: gravity (center/right/left/bottom/top)自己内容的位置  比如Button中的text 的位置

android: hint   (string)    提示信息,当文本框为空的时候显示,点击消失  Edittext中使用

android: singleLine   (true/false)  设置单行输入,一旦设置为true,则文字不会自动换行

android:textColor(#123456)  设置字体颜色

android: textStyle (bold/italic/bolditalic)设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用“|”隔开

android:textSize  (20sp)设置字体大小

android:editable(true/false)是否可编辑  edittext中才有效

android:textColorHighlight (#ffffff) 文字底色

android:textColorHint (#ffffff)提示文字颜色 edittext中才有效

android:textScaleX (1.5)文字距离

android:background  设置背景  可以是图片、颜色、@drawable/中的样式

android:layout_weight (1、2、3)权重  一般用在linearLayout中的

android:autoLink(none、web、email、phone、map、all)设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接

android: cursorVisible  (true/false)设置光标是否显示

android: digits (123asdasaf/正则表达式) 限制输入内容

android: ellipsize (start、end、middle、marquee)设置当文字过长时,该控件该如何显示。有如下值设置:”start”省略号显示在开头;”end”省略号显示在结尾;”middle”省略号显示在中间;”marquee”以跑马灯的方式显示(动画横向移动)

android :inputType   (none、text、textCapCharacters字母大小、textCapWords单词首字母大小、textCapSentences仅第一个字母大小、textAutoCorrect、textAutoComplete自动完成、textMultiLine多行输入、textImeMultiLine输入法多行(如果支持)、textNoSuggestions不提示、textEmailAddress电子邮件地址、textEmailSubject邮件主题、textShortMessage短信息(会多一个表情按钮出来)、textLongMessage长讯息?、textPersonName人名、textPostalAddress地址、textPassword密码、textVisiblePassword可见密码、textWebEditText作为网页表单的文本、textFilte文本筛选过滤、textPhonetic拼音输入、numberSigned有符号数字格式、numberDecimal可带小数点的浮点格式、phone电话号码、datetime时间日期、date日期、time时间。)设置文本类型

android: maxLines     设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示

android:minLines  设置文本的最小行数

android:scrollHorizontally  设置文本超出TextView的宽度的情况下,是否出现横拉条。

android:clickable (true/false) view是否能对click事件作出反应

android:onClick  当view被click之后,view的context的哪个方法被呼叫。通常这个context是指view所在的Activity。例如:android:onClick='sayHello',则相应的Activity里面有一个方法public void sayHello(View view)方法,当这个view被click之后,sayHello方法就会被调用。

android:longClickable  true/false  view是否可以对长时间的click事件作出反应。

⑷ Android 悬浮窗如何能让它和他的的下层一起响应触摸事件

/**
* 创建一个小悬浮窗。初始位置为屏幕的右部中间位置。
*
* @param context 必须为应用程序的Context.
*/
public static void createSmallWindow(Context context) {
WindowManager windowManager = getWindowManager(context);
int screenWidth = windowManager.getDefaultDisplay().getWidth();
int screenHeight = windowManager.getDefaultDisplay().getHeight();
if (smallWindow == null) {
smallWindow = new FloatWindowSmallView(context);
if (smallWindowParams == null) {
smallWindowParams = new LayoutParams();
smallWindowParams.type = LayoutParams.TYPE_PHONE;
smallWindowParams.format = PixelFormat.RGBA_8888;
smallWindowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
smallWindowParams.gravity = Gravity.LEFT | Gravity.TOP;
smallWindowParams.width = FloatWindowSmallView.viewWidth;
smallWindowParams.height = FloatWindowSmallView.viewHeight;
smallWindowParams.x = screenWidth;
smallWindowParams.y = screenHeight / 2;
}
smallWindow.setParams(smallWindowParams);
windowManager.addView(smallWindow, smallWindowParams);
LogPrinter.i(TAG, "添加了小浮标View");
}
}
smallWindowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE;

⑸ android SwitchButton 和CheckBox 怎样设置不可点击,Clickable无效

  1. 在线程还在进行时设置按钮不可点击setClickable(false);

    getState()返回该线程的状态;

    isAlive()测试线程是否处于活动状态;

    view都是setClickable(false); 表示不可点击的;

  2. 当然你还可以直接注册一个Touche事件,然后在onTouche里return true;

阅读全文

与androidclickable相关的资料

热点内容
三星qx2是什么安卓系统 浏览:203
保鲜膜解压球教学视频 浏览:601
多媒体算法工程师camera 浏览:987
电脑下载的歌可以拉到文件夹吗 浏览:722
千锋3g学院android 浏览:445
linux中的yum命令 浏览:239
压缩面膜有几种 浏览:575
怎么更改安卓程序级别 浏览:393
安卓系统运行慢怎么办呢 浏览:808
外地人在买车本地可以解压嘛 浏览:907
相册软件加密怎么取消 浏览:251
麦克风app怎么打开 浏览:22
java泛型t和 浏览:356
计算机英文pdf 浏览:587
单片机控制的直流调速系统 浏览:130
抖音上解压视频书单号怎么做 浏览:165
软件加密之后忘了密码怎么办 浏览:944
文件夹怎么弹出来的 浏览:209
51单片机引脚图电路 浏览:214
麦当劳员工怎么登录app 浏览:530