尝试用kotlin做一个app(三)

新闻列表

添加新闻列表可以使用RecyclerView。但是有个问题,RecyclerView只会在内部滚动,不会带动整个屏幕滚动。所以在原根布局外层添加androidx.core.widget.NestedScrollView,并且在原先根局部,添加android:descendantFocusability,解决进入页面跳入页面底部的问题。

·添加RecyclerView

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/homepage_news_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/homepage_line5"
        android:layout_marginTop="10dp"/>

·新建RecyclerView三种item样式,分别表示推荐文章图片,一般文章标题和下划线

fragment_home_news_item_recommand.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="wrap_content">
    <ImageView
        android:id="@+id/homepage_news_item_recommand"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:scaleType="centerCrop"/>

</LinearLayout>

fragment_home_news_item_normal.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp">
<ImageView
    android:id="@+id/homepage_news_item_image"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:layout_marginRight="10dp" /><!--android:background="@drawable/borders1"-->
    <TextView
        android:id="@+id/homepage_news_item_text"
        android:layout_width="0dp"
        android:layout_height="45dp"
        android:layout_weight="1"
        android:text="test"
        android:gravity="center_vertical" />

</LinearLayout>

fragment_home_news_item_line.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="wrap_content"
    android:paddingRight="10dp"
    android:paddingLeft="10dp">
<ImageView
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:background="#f8f8f8"/>
</LinearLayout>

·新建HomePageNewsAdapter

class HomePageNewsAdapter:RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    //定义两种类型item
    private val TYPE_RECOMMAND=0
    private val TYPE_NORMAL=1
    private val TYPE_LINE=2
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        var holder:RecyclerView.ViewHolder?=null
        when(viewType){

            TYPE_RECOMMAND->holder= HomePageViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.fragment_home_news_item_recommand,parent,false))
            TYPE_NORMAL->holder=return HomePageViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.fragment_home_news_item_normal,parent,false))
            TYPE_LINE->holder=return HomePageViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.fragment_home_news_item_line,parent,false))
        }
        return holder!!
        //return HomePageViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.fragment_home_news_item_normal,parent,false))
    }

    override fun getItemCount(): Int {
        return 11
    }

    var titles= listOf("标题1","标题2","标题三","标题四","标题五")
    var imageIds=listOf(R.drawable.news_title1,R.drawable.news_title2,R.drawable.news_title3,R.drawable.news_title4,R.drawable.news_title5)

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        var type:Int=holder.itemViewType
        when(type){
            TYPE_RECOMMAND->{
                var imageView:ImageView=holder.itemView.findViewById(R.id.homepage_news_item_recommand)
                imageView.setImageResource(R.drawable.news_recommand)
            }
            TYPE_NORMAL->{
                var textView: TextView =holder.itemView.findViewById(R.id.homepage_news_item_text)
                textView.text=titles[position/2-1]
                var imageView:ImageView=holder.itemView.findViewById(R.id.homepage_news_item_image)
                imageView.setImageResource(imageIds[position/2-1])
            }
            TYPE_LINE->{

            }
        }

    }

    //item类型
    override fun getItemViewType(position: Int): Int {
        var type:Int=-1
        if(position==0){
            type=TYPE_RECOMMAND
        }else if(position%2==1){
            type=TYPE_LINE
        }else if (position%2==0) {
            type = TYPE_NORMAL
        }
        return type
    }

    class HomePageViewHolder(itemView: View) :RecyclerView.ViewHolder(itemView){

    }
}

·在HomePageFragment中定义变量,赋值

homepage_news_container.layoutManager=LinearLayoutManager(context)
homepage_news_container.adapter=HomePageNewsAdapter()

这样基本的效果就有了。有个问题是我想把标题文字旁边的图片做成圆形的

简单的方法是PS一下,截取圆的部分,背景透明;用编程实现好像有点复杂,我试过为ImageView定义一个圆形的背景,但是添加图片,大概会把原来定义好的背景覆盖掉。

一种android中实现“圆角矩形”的方法提供了有效的方法

关于canvas的文章

Android 圆角、圆形 ImageView 实现

Android知识总结——Path常用方法解析

测试一下,先来个简单的

class NiceImageView: ImageView {
    private var radiusArray:FloatArray=FloatArray(8,{0f})//绘制区域,加圆角的横轴半径,纵轴半径组成的数组
    //private var radiusArray= floatArrayOf(0f,0f,0f,0f,0f,0f,0f,0f)
    //private var radiusArray=FloatArray(8)
    constructor(context: Context) : super(context) {

    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {

    }
    constructor(context: Context,attrs:AttributeSet,defAttrStyle:Int):super(context,attrs,defAttrStyle){

    }

    constructor(context: Context,attrs:AttributeSet,defAttrStyle:Int,defStyleSet:Int):super(context,attrs,defAttrStyle,defStyleSet) {
    }

//    fun setRound(letTop:Float,rightTop:Float,rigthBottom:Float,leftBottom: Float){
//        radiusArray.set(0,letTop)
//        radiusArray.set(1,letTop)
//        radiusArray.set(2,rightTop)
//        radiusArray.set(3,rightTop)
//        radiusArray.set(4,rigthBottom)
//        radiusArray.set(5,rigthBottom)
//        radiusArray.set(6,leftBottom)
//        radiusArray.set(7,leftBottom)
//    }

    override fun onDraw(canvas: Canvas?) {
        var path:Path= Path()
        //toFloat和as Float是不一样
//        path.addRoundRect(RectF(0f,0f,width.toFloat(),height.toFloat()),radiusArray,Path.Direction.CW)//Path.Direction.CW按顺时针,Path.Direction.CCW按逆时针;
//        canvas!!.clipPath(path)
        path.addCircle(width/2.toFloat(),height/2.toFloat(),width/2.toFloat(),Path.Direction.CW)
        canvas!!.clipPath(path)
        super.onDraw(canvas)
    }

}

布局文件

<com.vocus.canvas.NiceImageView
    android:id="@+id/image1"
    android:layout_width="80dp"
    android:layout_height="80dp" />

使用

image1.setImageResource(R.drawable.berry)

效果

(这个图背景是白色,锯齿不太明显,但是换成其他颜色背景图,就会有明显锯齿)

这里图片来源必须是src不能说设置成背景图片

这种方法有个缺点是不能抗锯齿

抗锯齿的代码是这样

var srcRectf=RectF(0f,0f,width.toFloat(),height.toFloat()) //原始图片Rect
        canvas!!.saveLayer(srcRectf,null)//创建一个新图层
        super.onDraw(canvas)//调用父类方法把canvas绘制在创建的图层上
        //绘制圆
        var path:Path= Path()
        path.addCircle(width/2.toFloat(),height/2.toFloat(),height/2.toFloat(),Path.Direction.CW)
        var paint=Paint(Paint.ANTI_ALIAS_FLAG)//画笔抗锯齿
        paint.style=Paint.Style.FILL
        paint.xfermode=PorterDuffXfermode(PorterDuff.Mode.DST_IN) //PorterDuff颜色渲染器,来源人名。MODE_SRC_IN取两层绘制交集,显示上层,Mode_DST_IN取交集,显示下层
        canvas.drawPath(path,paint)

        paint.xfermode=null

        canvas.restore()//恢复

效果

其实跟PS差不多。。。有些图片不规则,所以最好设置一下imageView的属性android:scaleType="centerCrop"

还有可以设置一下边框,遮罩层什么的。这里就不弄了

主页界面这样就算做完了吧

源码

链接:https://pan.baidu.com/s/11pmbo_O4L9qDI7bqdPvzKw
提取码:te93

原文地址:https://www.cnblogs.com/vocus/p/12355469.html

时间: 2024-10-30 06:23:40

尝试用kotlin做一个app(三)的相关文章

尝试用kotlin做一个app(十六)

继续优化一下可折叠的toolbar.目前的效果是这样 这里有几个问题: 1.我这里是设置了一下状态栏的颜色,但是要设置状态栏透明.设置状态栏透明之后,其实是actionbar会与状态栏重合,而toolbar并不会.所以要在activity中设置setSupportActionBar(Toolbar),让toolbar act as actionbar 2.toolbar和状态栏重合问题,按照之前的方法应该设置toolbar具有一个与状态栏高度的paddingTop,但是这里有个更简单的方法,即在

尝试用kotlin做一个app(八)

点击新闻列表进入详情页 使用WebView 1.准备工作 现在没有办法把整个网站前端都做出来,就先做一个新闻页面吧.新闻页面也要连接数据库,要使用之前写后台的JDBC类,所以我想可以在原来项目中增加一个“子项目”.那就要调整一下原来项目的结构. 调整后的项目结构是这样的 以下是遇到的问题和解决方法 idea项目重命名 如果出现错误javax.management.InstanceNotFoundException: Catalina:type=Server,查看artifacts下的是否还保留了

尝试用kotlin做一个app(五)

JSP后台管理系统 开发工具是IntelliJ IDEA+tomcat+mysql5.6.19+mysql-connector-java-5.1.48.jar+easyui+kindeditor 之前也有记录一些Servlet基础(java,idea) 这篇我只把一些重要的记录一下 easyui官方文档 kindeditor官方文档 easyui很简单,而且中文文档介绍得很详细,对照文档做就好了 kindeditor问题比较多,这里记录一下 准备工作 mysql数据库test中建立t_hp_ne

尝试用kotlin做一个app(六)

还是关于JSP后台管理系统的,有几个问题要解决一下 使用虚拟路径访问本地图片 之前在kindeditor编辑框插入图片时,是把图片文件转换为base64编码的形式:还有一种方法是使用虚拟地址.另外图片在数据库中存储的时候,应该是存储图片的虚拟地址(当然也可以是图片的二进制流数据). 可以参考 idea设置tomcat虚拟路径的两种方法 配置好了之后,就得把图片的路径上传到数据库中,更新表t_hp_new的thumb字段 后台登录状态验证 这里先不做,因为程序还在调试,每次进入要登录也是很麻烦了.

尝试用kotlin做一个app(十一)

为新闻列表页加载数据库数据,并为条目添加点击事件,点击进入新闻详情页 又转战后台了 java文章,kotlin文章还有其他文章是用一个表,还是分别建不同的表呢,我想还是建一个表吧,为表增加一个分类的字段就行了.文章一共有10个类别,分别是: 新建两个表.一个是文章表,一个是用户表.两个表包含的字段信息如下 数据库表也是有命名规范的,但是我这暂时不用处理很复杂的表,所以命名直白点就好.文章应该有作者,又要通过文章的作者查询到作者的头像,所以应该有一次联合查询. create table artic

做一个App究竟要花多少钱?

作为互联网从业者,被外行的朋友们问及最多的问题是: “做一个网站需要多少钱?”或者“做一个APP需要多少钱?”. 作为做过完整网站项目和APP的人,今天从产品经理的角度,一起来算一下中小型APP从无到有需要做哪些工作,以及为达成使命,需要付出多少金钱代价. 以下内容的前提是: 深圳.移动互联网方向.包含研发一个新产品过程中一些常见的工作,并非十全十美. 首先假设在做APP之前我们已经有了一个成熟的团队(这是非常幸运的前提,很多产品研发进度极其缓慢的原因之一就是在过程中不断在招人),团队的结构以架

做一个 App 前需要考虑的几件事

做一个 App 前需要考虑的几件事 来源:limboy的博客 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 App 有了一定规模后,再感慨当初为什么没有多留点心. 完善的日志系统 以 iOS 为例,有时图方便,就直接用 NSLog 了,甚至线上都一直开着.一方面会影响性能,尤其是输出比较频繁的时候,另一方面也容易泄露敏感信息,所以一般做法是在 Release 模式下禁用 NSLog,比如在 pch 文件中,通过

做一个App前需要考虑的几件事

本文转载于文章原文链接,版本归原作者所有! 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 App 有了一定规模后,再感慨当初为什么没有多留点心. 此处由标哥的技术博客站长点评: 看完本篇文章之后,也让我想起了不少以前做过的蠢事,做过很多重复的工作.之前在项目中使用过cocoalumberjack,个人感觉是很不错的日志管理框架.当然,不一定要求使用它,也在另一家公司里,原来的人将NSLog重定义了,改写了输出,

如何利用php+android+新浪sae服务器做一个app下载应用

功能简介:提供一个app下载的平台,类似于appstore,上面有很多app可供下载 实现基本思路:利用android,在手机桌面建立一个图标,点击该图标不是打开app应用,而是跳转到一个web页面,这个web页面是部署在新浪sae服务器上面的,apk资源也是存放到新浪sae服                     务器上,本例子使用的web变成语言主要是利用smarty模板php编写的 首先是android页面,就一个简单的url跳转,把跳转到activity换成跳转到web页面,代码如下