UI--微博(动态)点赞,简单效果中的不简单门道

《代码里的世界》UI篇

用文字札记描绘自己 android学习之路

转载请保留出处 by Qiao
http://blog.csdn.net/qiaoidea/article/details/45850641

【导航】
- 单行文本水平触摸滑动效果 通过EditText实现TextView单行长文本水平滑动效果
- 多行文本折叠展开 自定义布局View实现多行文本折叠和展开


1.概述

  说起空间动态、微博的点赞效果,网上也是很泛滥,各种实现与效果一大堆。而详细实现的部分,讲述的也是参差不齐,另一方面估计也有很多大侠也不屑一顾,觉得完全没必要单独开篇来写和讲解吧。毕竟,也就是两个view和一些简单的动画效果罢了。
  单若是只讲这些,我自然也是不愿花这番功夫的。虽然自己很菜,可也不甘于太菜。所以偶尔看到些好东西,可以延伸学写下,我还是很情愿拿出来用用,顺带秀一秀逼格什么的。
  不扯太多,先说说今天实现点赞效果用到的自以为不错的两个点:

  • Checkable 用来扩展View实现选中状态切换
  • AndroidViewAnimations 基于nineoldandroids封装的android动画简易类库。究竟有多简单呢,就像这样

    AnimHelper.with(new PulseAnimator()).duration(1000).playOn(imageView);
    作用: 在imageView上使用PulseAnimator这个动画效果,播放一秒。

      当然是从实现角度来看这个库啦,如果仅仅是使用,google/百度一大堆啦。
      
    结合前两篇富文本折叠展开,加上我们的点赞view 做出的demo整合效果图:
    点赞效果


2.从实现看门道

  其实从效果看无非就是点击切换图片,并添加一些简单动画效果而已,确实没什么难度。这里是因为引入了两个不错的新内容,使用下,权当新手尝鲜。

2.1 Checkable接口实现CheckedImageView

  系统本身提供了android.widget.Checkable这样一个接口,方便我们继承实现View的选中和取消的状态。看下这个类:

public interface Checkable {
   

    /**
     * 设置view的选中状态
     */
    void setChecked(boolean checked);

    /**
     * 当前view是否被选中
     */
    boolean isChecked();

    /**
     *改变view的选中状态到相反的状态
     */
    void toggle();
}

  通常这个接口用来帮助我们快速实现view的可选效果,增加了选中和取消两种状态和切换方法。另外为了方便View在状态改变时候快速地变看到效果(更背景或图片),我们可以直接通过selector控制图片,而其本身并不会自动改变drawable状态,因此这里还有必要重写drawableStateChanged
方法。我们先以定义一个通用的CheckedImageView为例:


public class CheckedImageView extends ImageView implements Checkable{
   
    protected boolean isChecked;//选中状态
    protected OnCheckedChangeListener onCheckedChangeListener;//状态改变事件监听

    public static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };

    public CheckedImageView(Context context) {
        super(context);
        initialize();
    }

    public CheckedImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize();
    }

    private void initialize() {
        isChecked = false;
    }

    @Override
    public boolean isChecked() {
        return isChecked;
    }

    @Override
    public void setChecked(boolean isChecked) {
        if (this.isChecked != isChecked) {
            this.isChecked = isChecked;
            refreshDrawableState();

            if (onCheckedChangeListener != null) {
                onCheckedChangeListener.onCheckedChanged(this, isChecked);
            }
        }
    }

    @Override
    public void toggle() {
  //改变状态
        setChecked(!isChecked);
    }

    //初始DrawableState时候为它添加一个CHECKED_STATE,ImageView本身是没有这个状态的
    @Override
    public int[] onCreateDrawableState(int extraSpace) {
        int[] states = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDr
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
首先,需要在后端实现点赞功能,并将点赞的信息保存到数据库。然后,在前端页面,使用 templates 和 semantic-ui 来实现点赞通知页面。 1. 后端实现点赞功能 在后端,需要创建一个点赞的视图函数,该函数需要接收点赞的请求,并将点赞的信息保存到数据库。例如: ```python from django.shortcuts import get_object_or_404, render from django.http import HttpResponse, JsonResponse from .models import Post, Like def like_post(request, post_id): post = get_object_or_404(Post, id=post_id) like, created = Like.objects.get_or_create(user=request.user, post=post) if created: message = 'You liked this post.' else: message = 'You already liked this post.' return JsonResponse({'message': message}) ``` 在这个视图函数,首先通过 post_id 获取到对应的帖子对象,然后使用当前登录用户和该帖子对象创建一个 Like 对象。如果创建成功,则说明该用户之前还没有点赞过该帖子,否则说明该用户已经点赞过了。最后返回一个 JSON 格式的响应,包含点赞的信息。 2. 前端实现点赞通知页面 在前端,可以使用 templates 和 semantic-ui 来实现点赞通知页面。首先,需要在页面引入 semantic-ui 的样式和 JavaScript 文件。例如: ```html {% load static %} <link rel="stylesheet" href="{% static 'semantic/semantic.min.css' %}"> <script src="{% static 'semantic/semantic.min.js' %}"></script> ``` 然后,在页面添加一个点赞按钮和一个通知框,如下所示: ```html <div class="ui segment"> <h3>Post Title</h3> <p>Post Content</p> <button class="ui labeled icon button like-post" data-post-id="{{ post.id }}"> <i class="heart outline icon"></i> Like </button> <div class="ui message hidden like-message"> <div class="header">You liked this post.</div> </div> </div> ``` 在这个页面,使用了 semantic-ui 的按钮和通知框组件。点赞按钮上绑定了一个 like-post 类,同时设置了一个 data-post-id 属性,该属性保存了当前帖子的 ID。当用户点击点赞按钮时,会触发一个 JavaScript 函数。 ```javascript $(function () { $('.like-post').click(function (event) { event.preventDefault(); var $button = $(this); var post_id = $button.data('post-id'); $.post('/like-post/' + post_id + '/', function (data) { var $message = $button.siblings('.like-message'); $message.find('.header').text(data.message); $message.removeClass('hidden').transition('fade'); }); }); }); ``` 在这个 JavaScript 函数,首先使用 jQuery 获取到所有的点赞按钮,并绑定了一个 click 事件。当用户点击按钮时,会阻止默认的提交事件,并获取到该按钮绑定的 data-post-id 属性,然后使用 AJAX 发送一个 POST 请求到后端的点赞视图函数。当请求返回成功时,获取到响应的 message 属性,并将该属性设置到通知框的标题。最后显示通知框并使用 fade 动画效果隐藏该通知框。 以上就是一个基本的点赞通知页面的实现方法。需要注意的是,在实际开发,还需要对用户的登录状态进行判断,以及对点赞次数进行限制等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值