布局基础<kotlin>2,自定义控件(整理自网络)
引导页
ViewPager
代码清单
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/bg"
android:scaleType="centerCrop"/> <androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="50dp"
android:id="@+id/myViewPage"/>
<LinearLayout
android:id="@+id/dot_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/myViewPage"
android:layout_centerHorizontal="true"
android:orientation="horizontal"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="..."
android:textSize="30sp"
android:textColor="#ccc"
android:textStyle="bold" />
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_alignParentBottom="true">
<TextView
android:id="@+id/skipBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:text="跳过"
android:textColor="#fff"/>
<TextView
android:id="@+id/nextBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="30dp"
android:text="下一页"
android:textColor="#fff"/>
</RelativeLayout> </RelativeLayout>
page.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/pageIcon"
android:layout_width="match_parent"
android:layout_height="280dp"
android:src="@drawable/ic_face1"
android:layout_marginTop="80dp"/>
<TextView
android:id="@+id/pageTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/page_title1"
android:textSize="30dp"
android:gravity="center"
android:layout_marginTop="30dp"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/page_desc"
android:layout_margin="30dp"
/>
</LinearLayout>
ViewPagerAdapter.kt
package com.vocus.sepcialeffects import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.viewpager.widget.PagerAdapter class ViewPagerAdapter:PagerAdapter() { override fun isViewFromObject(p0: View, p1: Any): Boolean {
return p0==p1
} override fun getCount(): Int {
return 3
} private val icons= intArrayOf(R.drawable.ic_face1,R.drawable.ic_face2,R.drawable.ic_face3)
private val titles= intArrayOf(R.string.page_title1,R.string.page_title2,R.string.page_title3) override fun instantiateItem(container: ViewGroup, position: Int): Any {
val page=LayoutInflater.from(container.context).inflate(R.layout.page,container,false)
val pageIcon=page.findViewById<ImageView>(R.id.pageIcon)
val pageTitle=page.findViewById<TextView>(R.id.pageTitle) pageIcon.setImageResource(icons[position])
pageTitle.text=container.resources.getText(titles[position]) container.addView(page)
return page
} override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
container.removeView(`object` as View)
}
}
MainActivity.kt
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import androidx.viewpager.widget.ViewPager
import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) val adpter=ViewPagerAdapter()
myViewPage.adapter=adpter skipBtn.setOnClickListener{
finish()
}
nextBtn.setOnClickListener{
myViewPage.currentItem+=1
}
addDots() myViewPage.addOnPageChangeListener(object: ViewPager.OnPageChangeListener{
override fun onPageScrollStateChanged(state: Int) {
} override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) { } override fun onPageSelected(position: Int) {
addDots(position)
} }) } fun addDots(posi:Int=0){
val dots=arrayOf(TextView(this),TextView(this),TextView(this))
dot_container.removeAllViews()
dots.forEach {
it.text="."
it.textSize=30f
it.paint.isFakeBoldText=true
it.setTextColor(Color.GRAY)
dot_container.addView(it)
}
dots[posi].setTextColor(Color.WHITE)
}
}
效果



图片轮播(广告)
动态设置view的测试
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var textView1= TextView(this)
textView1.textSize = 30f
textView1.text = "haha"
textView1.setTextColor(Color.BLUE)
textView1.id=R.id.textView1
var textView2 = TextView(this)
textView2.textSize = 30f
textView2.text = "xixi"
textView2.setTextColor(Color.BLUE)
var params1=RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)
params1.leftMargin=20
container.addView(textView1,params1)
var params2=RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)
params2.leftMargin=20
params2.addRule(RelativeLayout.RIGHT_OF,R.id.textView1)
container.addView(textView2,params2)
}
其实跟制作引导页的方法差不多
MainActivity.kt
class MainActivity : AppCompatActivity() {
var imageViews = ArrayList<ImageView>()
var titles = listOf<String>("图片1", "图片2", "图片3", "图片4", "图片5")
var imagesIds = listOf<Int>(
R.drawable.pic1,
R.drawable.pic2,
R.drawable.pic3,
R.drawable.pic4,
R.drawable.pic5
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var textView = findViewById<TextView>(R.id.myTitle)
//需要初始化一下
textView.text = titles[0]
textView.setTextColor(Color.WHITE)
var prePosition = 0
for (i in 0 until imagesIds.size) {
var imageView = ImageView(this)
imageView.setBackgroundResource(imagesIds[i])
imageViews.add(imageView)
var point = ImageView(this)
//point_selector.xml要自己创建
point.setBackgroundResource(R.drawable.point_selector)
if (i == 0) point.isEnabled = true else point.isEnabled = false
var params = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
params.leftMargin = 5
pointGroup.addView(point, params)
}
myViewPager.adapter = myPagerView(imageViews)
myViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
}
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
textView.text = titles[position]
pointGroup.getChildAt(prePosition).isEnabled = false
pointGroup.getChildAt(position).isEnabled = true
prePosition = position
}
})
}
class myPagerView() : PagerAdapter() {
private val imageViews = ArrayList<ImageView>()
constructor(imageViews: ArrayList<ImageView>) : this() {
this.imageViews.addAll(imageViews)
}
override fun isViewFromObject(view: View, `object`: Any): Boolean {
return view == `object`
}
override fun getCount(): Int {
return 5
}
override fun instantiateItem(container: ViewGroup, position: Int): Any {
var view = imageViews.get(position)
container.addView(view)
return view
}
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
//super.destroyItem(container, position, `object`)
container.removeView(`object` as View)
}
}
}
point_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/point_normal" android:state_enabled="false"></item> <item android:drawable="@drawable/point_press" android:state_enabled="true"></item>
</selector>
point_normal.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<size android:width="5dp" android:height="5dp"/>
<solid android:color="#44000000"/>
</shape>

不过还要加上左右无限滑动和自动滑动。。
加上无限滑动只要把
override fun getCount(): Int {}中 返回的页面数改成Int.MAX_VALUE
在根据position获得图片列表资源的时候对position%viewImages.size取模
最后把当前页面位置设置为总页数的中间myViewPager.currentItem= Int.MAX_VALUE/2-Int.MAX_VALUE/2%imageViews.size
加上自动滑动用Handler
val handler:Handler=object:Handler(){
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
var item=myViewPager.currentItem+1
myViewPager.setCurrentItem(item)
sendEmptyMessageDelayed(0,4000)
}
}
handler.sendEmptyMessageDelayed(0,4000)
布局基础<kotlin>2,自定义控件(整理自网络)的更多相关文章
- 布局基础<kotlin>(整理自网络)
全屏 主界面 底部导航,bottombar 添加依赖 implementation 'com.roughike:bottom-bar:2.3.1' 主界面布局 <com.roughike.bot ...
- 微信小程序学习笔记(7)--------布局基础
ui布局基础 一.flex布局 1.flex的容器和元素 2.flex容器属性详解 1>flex-direction不仅设置元素的排列方向,还设置主轴和交叉轴如下图主轴是由上到下 2&g ...
- 学习笔记 第十一章 CSS3布局基础
第11章 CSS3布局基础 [学习重点] 了解CSS2盒模型. 设计边框样式. 设计边界样式. 设计补白样式. 了解CSS3盒模型. 11.1 CSS盒模型基础 页面中所有元素基本显示形态为方形 ...
- mysql基础知识语法汇总整理(二)
mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...
- mysql基础知识语法汇总整理(一)
mysql基础知识语法汇总整理(二) 连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...
- Java面试之Java基础问题答案口述整理
Java面试之基础问题答案口述整理 面向对象的理解 面向对象思想就是在计算机程序设计过程中,把具体事物的属性特性和行为特征抽象出来,描述成计算机事件的设计思想.它区别于面向过程的思想,强调的是通过调用 ...
- css布局基础总结
前端css布局知识繁杂,实现方式多种多样.想写出高效.合理的布局,必须以深厚的css基础为前提.为了方便记忆和复习,将css布局要点记录如下.内容较多,应用方面说的不太详细,但都是很实用的点. 所谓布 ...
- 【理论面试篇】收集整理来自网络上的一些常见的 经典前端、H5面试题 Web前端开发面试题
##2017.10.30收集 面试技巧 5.1 面试形式 1) 一般而言,小公司做笔试题:大公司面谈项目经验:做地图的一定考算法 2) 面试官喜欢什么样的人 ü 技术好. ...
- 【编码题篇】收集整理来自网络上的一些常见的 经典前端、H5面试题 Web前端开发面试题
编写一个方法 求一个字符串的字节长度假设:一个英文字符占用一个字节,一个中文字符占用两个字节 function GetBytes(str){ var len = str.length; var byt ...
随机推荐
- MySQL 通过SQL语句导出表为文件
SELECT * //你要导出的字段 FROM `tabel` //表名 INTO OUTFILE "D:\\file.txt" //导出的文件路径和文件名 LINES TERMI ...
- 第二单元总结:基于synchronize锁的简单多线程设计
单元统一的多线程设计策略 类的设计 电梯 每部电梯为一个线程. 电梯从调度器接收原子指令,知晓自己的状态(内部的人/服务的人.运行方向.所在楼层) 原子指令包括且仅包括: 向上走一层 / 向下走一层 ...
- 第3节 sqoop:4、sqoop的数据导入之导入数据到hdfs和导入数据到hive表
注意: (1)\001 是hive当中默认使用的分隔符,这个玩意儿是一个asc 码值,键盘上面打不出来 (2)linux中一行写不下,可以末尾加上 一些空格和 “ \ ”,换行继续写余下的命令: bi ...
- oracle练习-day04
.什么是PL.PL.普通变量和常量使用) :) :.引用型变量 .记录型变量.条件分支语法:if 条件 .根据输入的年龄判断小于输出未成年人,成年人,以上老年人): .loop循环语法:.输出到的数 ...
- JS写一个旋转木马的视频播放效果
JS以及JQ的功能很强大,可以做出很多的优秀效果.今天给大家分享一个我之前写网站用到的旋转木马效果. 大概效果图就是这样的,上面的视频播放是旋转木马效果. 下面的音乐播放效果放在下一篇内容里面讲. 直 ...
- IntelliJ IDEA使用技巧—使用EasyCode插件一键生成代码04期
在现如今的软件开发过程中,软件开发人员将很多的精力放在重复的编码中.特别是流行的MVC架构模式下,项目各个层次的功能更加独立,这也间接的造成了代码的相似度更高.因此需要寻找一种可以减少软件开发人员重复 ...
- Linux服务器命令大全
快捷提示键: table 查看文件夹: ls , ls –all ,ls –l,ll 进入某个文件夹: cd usr/local 回到root 目录 : cd /root/ 回到根目录:cd / 回 ...
- NO4 find&mv-&-特殊符号..和.
问题七:退到上一级目录,删除data目录. 解答:cd ..或cd ../ rm -r data或rmdir data#空目录就不需要带-rf,杀鸡不用宰牛刀,rmdir基本要淘汰的命令 ...
- springboot - 返回xml error 从自定义的 ErrorController
1.概览 2.在<springboot - 返回JSON error 从自定义的 ErrorController>基础上,做如下调整: 1).新增Attribute类和Error类 pac ...
- checkbox checked属性值
记住我1<input type='checkbox' /> 记住我2<input type='checkbox' /> <button onclick='hehe();' ...