Android牛博

摘要: 本文介绍下在Android中实现伸缩弹力分布菜单效果。关于这种菜单效果在IPhone中比较常见,效果比较酷。那么在Android中实现只是一种简单的模仿。 这两天无意间看到一园友的博文实现Path2.0中绚丽的的旋转菜单,感觉效果不错,但是发现作者没有处理线程安全的问题,所以在这里我修正了下,并且改善下部分功能。今天发布这篇文章的目的是希望能在Android用户体验上提出一些相关的解决方案,方便我们在开发项目或产品时增强用户体验效果,当然也希望能起到抛砖引玉的作用。^_^ 这里主要是用到Android中的动画效果,关于动画效果的基本知识,有需要的朋友可以查看这篇文章:http://ww...阅读全文
posted @ 2012-10-26 20:55 HarHar 阅读(6660) | 评论 (19) 编辑
 
摘要: 本文给大家介绍如何在Android中实现甘特图效果及其解决方案。 这段时间一直在忙于一个工程项目,其中用到了甘特图功能。可能熟悉的朋友都知道要在PC机上实现甘特图效果,不论是C++、.NET、JAVA还是Web脚本都可以方便的实现,而且网上有一些简单的源码可以供我们参考。但是要在Android手机上实现不是一件容易的事情,而且相应的开源源码相当少,这就要靠我们去寻找相应的解决方案并实现它。 可能一些不知道甘特图的朋友们就有点茫然,我还是借用一下百度百科的内容给大家对甘特图做一个基本的介绍,方便大家有个基本的认识。 甘特图又叫横道图、条状图,英文名字是GanttChart。它是在第一次...阅读全文
posted @ 2012-09-29 19:11 HarHar 阅读(3378) | 评论 (6) 编辑
 
摘要: 本文给大家介绍如何在Android中实现宫格图片连续滑动效果。 在这之前,写过几篇关于在Android中实现滑动的效果,毕竟滑动效果在Andriod开发中也使用得比较频繁,有兴趣的朋友请查看我以前的文章,这里不再详述。 今天写这篇文章的缘由是前一段时间一个网友在我的博客上面留言,想要实现在GridLayout(相当于九宫格)中点击每项可左右滑动显示该宫格的图片,当该宫格的图片显示完以后,接着显示下一宫格的图片。那么看过我以前关于滑动方面的文章的朋友,相信要实现前者的效果并不难,关键在于如何实现后者,即如何在一个宫格的图片显示完以后,接着显示下一宫格的图片。那么这就是我们今天这篇文章要探...阅读全文
posted @ 2012-09-24 12:01 HarHar 阅读(4323) | 评论 (26) 编辑
 
摘要: 本文介绍在Android中如何实现下拉导航选择菜单效果。 关于下拉导航选择菜单效果在新闻客户端中用的比较多,当然也可以用在其他的项目中,这样可以很方便的选择更多的菜单。我们可以让我们的应用顶部有左右滑动或进行切换的导航菜单,也可以为了增强用户体验在应用中添加这样的下拉导航选择菜单效果。 关于它的实现原理,其实也是挺简单的,就是使用PopupWindow来进行展现,在显示时控制其高度并配置以相应的动画效果。在PopupWindow中我使用GridView来控制里面的菜单项,每个菜单项对应相应的图片和文字。当然了,也有其他的实现方式。为了大家能够清楚的理解,让我们先看下效果图,如下所示: ...阅读全文
posted @ 2012-07-31 22:27 HarHar 阅读(9062) | 评论 (106) 编辑
 
摘要: 本文介绍在Android中实现局部的图片滑动指引效果。 其实关于Android滑动指引效果,我曾经发布过一篇文章,里面实现的整个页面的指引滑动,有兴趣的朋友可以查看:http://www.cnblogs.com/hanyonglu/archive/2012/04/07/2435589.html。 另外关于Android中的局部滑动,我也曾发布过一篇文章,是关于实现导航菜单的滑动,有兴趣的朋友可以查看:http://www.cnblogs.com/hanyonglu/archive/2012/04/21/2462311.html 今天发布本文的原因是应一个网友要求,就是实现局部的图...阅读全文
posted @ 2012-06-19 17:47 HarHar 阅读(12904) | 评论 (33) 编辑
 
摘要: 本示例演示如何在Android中使用加载器(Loader)来实现获取本机中的所有图片,并进行查看图片的效果。 在这个示例中,我使用android-support-v4.jar中的加载器(Loader)来实现获取本机中所有图片,关于这个包在以前的文章中也提到,是一个非常有用的包,关于这个包的详细信息请大家查看官方文档:http://developer.android.com/sdk/compatibility-library.html。 关于加载器(Loader)是在Android3.0中才开始引进并使用的,Android3.0以前的版本中要想使用加载器则需要用android-suppo...阅读全文
posted @ 2012-05-10 20:08 HarHar 阅读(7013) | 评论 (8) 编辑
 
摘要: 本文给大家介绍在Android中如何实现顶部导航菜单左右滑动效果。 今天给大家介绍在Android中实现顶部导航菜单左右滑动效果的二种解决方案。 第一种解决方案: 在以前的一篇博文中我使用android-support-v4.jar实现了左右滑动指引效果,有兴趣的朋友可以查看:http://www.cnblogs.com/hanyonglu/archive/2012/04/07/2435589.html 那么今天第一个示例我仍然使android-support-v4.jar来实现菜单左右滑动效果,关于这个包的信息,不再详述,大家可以查看官方文档。 实现原理是使用android-s...阅读全文
posted @ 2012-04-21 20:10 HarHar 阅读(21724) | 评论 (40) 编辑
 
摘要: 本文演示如何在Android中实现程序前后台切换效果。 在介绍程序实现之前,我们先看下Android中Activities和Task的基础知识。 我们都知道,一个Activity 可以启动另一个Activity,即使这个Activity是定义在别一个应用程序里的,比如说,想要给用户展示一个地图的信息,现在已经有一个Activity可以做这件事情,那么现在你的Activity需要做的就是将请求信息放进一个Intent对象里,并且将这个Intent对象传递给startActivity(),那么地图就可显示出来了,但用户按下Back键之后,你的Activity又重新出现在屏幕上。 对用户来...阅读全文
posted @ 2012-04-15 19:26 HarHar 阅读(15168) | 评论 (37) 编辑
 
摘要: 本文介绍Android平台中进程与线程的基本知识。 很早的时候就想介绍一下Android中的进程和线程,但由于其他的事情一直给耽搁了,直到现在才能和大家一起分享下。 1.Android进程基本知识: 我们先来了解下Android中的进程基本知识。 当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。 同时,Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足时,Android会尝试停止一些进程从而释放足够的资源给其他新的进程使用,...阅读全文
posted @ 2012-04-12 01:23 HarHar 阅读(4668) | 评论 (11) 编辑
 
摘要: 本文介绍Android中实现左右滑动的指引效果。 关于左右滑动效果,我在以前的一篇博文中提到过,有兴趣的朋友可以查看:http://www.cnblogs.com/hanyonglu/archive/2012/02/13/2349827.html 如果想实现带渐显按钮的左右滑动效果,请访问博文:http://www.cnblogs.com/hanyonglu/archive/2012/02/13/2350171.html 本文的目的是要实现左右滑动的指引效果。那么什么是指引效果呢?现在的应用为了有更好的用户体验,一般会在应用开始显示一些指引帮助页面,使用户能更好的理解应用的功能,甚至...阅读全文
posted @ 2012-04-07 03:51 HarHar 阅读(34835) | 评论 (93) 编辑
 
摘要: 本文介绍Android平台中一些免费的UI库及组件资源。 短短数年时间 Android 平台就已经形成了一个庞大而活跃的开发者社区。许多社区开发的项目业已进入成熟阶段,甚至可以用于商业的软件生产中,且不用担心质量问题。 本文编译自androiduipatterns,意在分享一些免费、开源的 Android UI 库及组件资源。 1. GreenDroid 该项目可以实现下列的 UI 设计:动作栏(Action Bar)快捷动作(Quick Action)工作区(Workspace)动态列表(Dynamic List) 以及许多更有用的组件。 项目网站/示例 应用程序屏幕截图...阅读全文
posted @ 2012-03-30 00:59 HarHar 阅读(5431) | 评论 (5) 编辑
 
摘要: 本文介绍Android平台中关于APN网络切换的相关知识以及如何实现APN切换。 由于最近的项目中用到APN切换的功能,所以就借着这个机会介绍一下APN的相关知识及如何在Android实现切换过程。关于APN的基本知识我会在下面给大家介绍。 在这个示例中,我使用圆角ListView显示效果,关于Android实现ListView圆角效果,大家可以查看我以前的一篇博文:http://www.cnblogs.com/hanyonglu/archive/2012/03/18/2404820.html 下面先来看下本示例实现的效果图: 在我们点击左图中"设置APN选项"时出现右边的阅读全文
posted @ 2012-03-29 14:13 HarHar 阅读(8754) | 评论 (29) 编辑
 
摘要: 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceState(),并且在介绍这两个方法之后,再分别来实现使用InstanceState保存和恢复数据功能、Android实现屏幕旋转异步下载效果这样两个示例。 首先来介绍onSaveInstanceState() 和 onRestoreInstanceState()。关于这两个方法,一些朋友可能在Android开发过程中很少用到,但在有时候掌握其用法会帮我们起到比较好的效果。尤其是在应用程序在不知道的情况下退出后,如何实现其数据保存的功能。先来让我们...阅读全文
posted @ 2012-03-28 00:24 HarHar 阅读(5780) | 评论 (5) 编辑
 
摘要: 本文介绍在Android开发中关于资源文件的存储操作。对于Android资源也是非常重要的,主要包括文本字符串(strings)、颜色(colors)、数组(arrays)、动画(anim)、布局(layout)、图像和图标(drawable)、音频视频(media)和其他应用程序使用的组件。 在Android开发中,资源文件是我们使用频率最高的,无论是string,drawable,还是layout,这些资源都是我们经常使用到的,而且为我们的开发提供了很多方便,不过我们平时接触的资源目录一般都是下面这三个: 当然了,Android资源文件还有其他类型,如下图所示: 这些资源...阅读全文
posted @ 2012-03-27 14:37 HarHar 阅读(5649) | 评论 (5) 编辑
 
摘要: 本文介绍Android平台上几种有用的的日历控件。日历控件在Web开发中有很多的解决方案,而且很容易实现,但是在Android平台上的解决方案较少且不容易实现。下面给大家开始介绍几种及我们实现的示例。 我们大家都知道,在Android平台3.0中才新增了日历视图控件,可以显示网格状的日历内容,那么对于Android 3.0以下的版本要使用日历控件只能借助第三方,目前用的最多的是CalendarView。先简单介绍下CalendarView日历控件的使用。 android.widget.CalendarView是从android.widget.FrameLayout中继承的。 Cale...阅读全文
posted @ 2012-03-26 16:58 HarHar 阅读(15628) | 评论 (16) 编辑
 
摘要: 本文介绍Android中Intent的各种常见作用。1 Intent.ACTION_MAINString: android.intent.action.MAIN标识Activity为一个程序的开始。比较常用。Input:nothingOutput:nothing<activityandroid:name=".Main"android:label="@string/app_name"><intent-filter><actionandroid:name="android.intent.action.MAIN"阅读全文
posted @ 2012-03-26 00:24 HarHar 阅读(8438) | 评论 (3) 编辑
 
摘要: 本文演示如何Android中实现ListView圆角效果。 无论是网站,还是APP,人们都爱看一些新颖的视图效果。直角看多了,就想看看圆角,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,特别是在iphone中几乎随处可见圆角设计,现在也开始出现很多圆角名片了。 现在就给大家实现一个圆角的ListView效果。 圆角的设计,我们并不追求到处都用,无处不用,android中有少数界面用直角确实容易显得锋利,和周边界面太过对比而显得不协调,比如大栏目列表,设置等等,而采用圆角实现,则会活泼,轻松的多,也融合的特别好。 先看下在IPhone中实现圆角效果的一个图片: 在Iphone中...阅读全文
posted @ 2012-03-18 17:48 HarHar 阅读(8496) | 评论 (11) 编辑
 
摘要: 本文介绍在Android中如何获取系统应用程序列表。 Android系统为我们提供了很多服务管理的类,包括ActivityManager、PowerManager(电源管理)、AudioManager(音频管理) 等。除此之外,还提供了一个PackageManger管理类,它的主要职责是管理应用程序包。 通过它,我们就可以获取应用程序信息。 PackageManager的功能: •安装,卸载应用 •查询permission相关信息 •查询Application相关信息(application,activity,receiver,service,provider及相应属性等) •查...阅读全文
posted @ 2012-03-18 11:25 HarHar 阅读(3906) | 评论 (1) 编辑
 
摘要: 本文介绍AndroidPn项目实现推送的使用过程。 在上一篇文章中提到在Android中实现推送方式的解决方案,其中一个比较成熟的解决方案便是使用XMPP协议实现。而AndroidPn项目就是使用XMPP协议实现信息推送的一个开源项目。在这里给大家介绍其使用过程。 Apndroid Push Notification的特点: 快速集成:提供一种比C2DM更加快捷的使用方式,避免各种限制. 无需架设服务器:通过使用"云服务",减少额外服务器负担. 可以同时推送消息到网站页面,android 手机 耗电少,占用流量少. 具体配置过程: 首先, 我们需要下载androidpn-.阅读全文
posted @ 2012-03-16 08:15 HarHar 阅读(26482) | 评论 (58) 编辑
 
摘要: 本文介绍在Android中实现推送方式的基础知识及相关解决方案。推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息。这种推送功能是好的一面,但是也会经常看到很多推送过来的垃圾信息,这就让我们感到厌烦了,关于这个我们就不能多说什么了,毕竟很多商家要做广告。本文就是来探讨下Android中实现推送功能的一些解决方案,也希望能够起到抛砖引玉的作用。^_^ 1.推送方式基础知识: 在移动互联网时代以前的手机,如果有事情发生需要通知用户,则会有一个窗口弹出,将告诉用户正在发生什么事情。可能是未接电话的提示,日历的...阅读全文
posted @ 2012-03-04 02:35 HarHar 阅读(33515) | 评论 (11) 编辑
 
摘要: 本文介绍在Android应用中如何提升视觉效果。 当我们投身这个领域时,每个开发者都想让自己的应用更加出色,在Android应用开发中,风格和设计或许不是最关键的要素,但它们在决定Android应用成功与否上确实扮演重要的角色。 以下是Android应用的UI设计技巧,还有个附加技巧,能够提升你的Android应用的视觉吸引力。 1.使用大小适当的图像 在图像方面,许多Android应用开发者采用的是大小单一的做法。尽管这会使资源管理变得更为简单,但就应用的视觉吸引力而言,这是个错误的做法。要让应用呈现出最佳的视觉效果,那么就应当针对具体的设备屏幕设计不同的图像。最适当的图像才能构建出最...阅读全文
posted @ 2012-03-02 00:06 HarHar 阅读(2985) | 评论 (2) 编辑
 
摘要: 本文介绍Android中的5种数据存储方式。 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1使用SharedPreferences存储数据 2文件存储数据 3SQLite数据库存储数据 4使用ContentProvider存储数据 5网络存储数据 下面将为大家一一详细介绍。 第一种:使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用Shar.阅读全文
posted @ 2012-03-01 00:37 HarHar 阅读(21989) | 评论 (7) 编辑
 
摘要: 本文介绍在Android平台中实现对XML的三种解析方式。 XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。 在Android中,常见的XML解析器分别为DOM解析器、SAX解析器和PULL解析器,下面,我将一一向大家详细介绍。 第一种方式:DOM解析器: DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。Android完全支持DOM 解析。利用DOM中的对象,可以对XML文..阅读全文
posted @ 2012-02-28 00:49 HarHar 阅读(3395) | 评论 (1) 编辑
 
摘要: 本文介绍在使用Eclipse开发Android程序时无法显示Android设计界面的解决方案。 我们在使用MyEclipse或Eclipse开发Android程序时,有进点击main.xml Design可能显示的不是设计界面,而是view属性界面,如下图所示: res/layout/main.xml,升级SDK和ADT之前,这个一直是显示界面,升级后,点开这个文件,切到Design,发现显示不了界面,而是以表格的形式显示的该界面中各个view的属性值!这是由于有时ADT和SDK版本之间的不兼容问题。所以尽量使用版本相同的ADT和SDK,另外最好使用目前最新版本的ADT。 解决办...阅读全文
posted @ 2012-02-27 12:03 HarHar 阅读(2114) | 评论 (0) 编辑
 
摘要: 本文演示在Android平台中绘制和展示图表示例,本示例是基于RChart 2实现的。 在一个系统中经常要用到图表统计数据,在WEB开发中图表绘制是一件简单的事情,因为有比较多的开源方案。但在Android中开源方案并不多。 Android中绘制图表解决方案: 1) 使用google 图表 api 2) 使用Achartengine库(http://www.achartengine.org/) 3) 使用chartdroid库(http://code.google.com/p/chartdroid/) 4) 使用RChart 2库实现。 第一种解决方案是使用google的图表A...阅读全文
posted @ 2012-02-20 18:51 HarHar 阅读(8695) | 评论 (11) 编辑
 
摘要: 本示例介绍在Android平台下通过HTTP协议实现断点续传下载。 我们编写的是Andorid的HTTP协议多线程断点下载应用程序。直接使用单线程下载HTTP文件对我们来说是一件非常简单的事。那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点。 使用多线程的好处:使用多线程下载会提升文件下载的速度。那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度。 HttpURLConnection.getContentLength();//获取下载文件的长度 RandomAccessFile file = new RandomAccessFile("Q阅读全文
posted @ 2012-02-20 00:14 HarHar 阅读(14647) | 评论 (21) 编辑
 
摘要: 本示例以Servlet为例,演示Android与Servlet的通信。 众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post两种方式。至于Socket通信会在以后的博文中介绍。 HTTP协议简介: HTTP (Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种协议。 HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。 在HTTP 1.0.阅读全文
posted @ 2012-02-19 01:56 HarHar 阅读(14585) | 评论 (6) 编辑
 
摘要: 本示例演示在Android中实现带渐显按钮的左右滑动效果。 关于滑动效果,在我的上一篇博文中提到过,有兴趣的朋友可以访问:http://www.cnblogs.com/hanyonglu/archive/2012/02/13/2349827.html 如果大家想实现带指引效果的左右滑动,请访问博文:http://www.cnblogs.com/hanyonglu/archive/2012/04/07/2435589.html 先看下运行效果: 程序结构: MainActivity文件中代码:packagecom.android.buttonpageflipper;import...阅读全文
posted @ 2012-02-13 23:07 HarHar 阅读(10740) | 评论 (2) 编辑
 
摘要: 本示例演示在Android中实现图片左右滑动效果。 关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现。接下来就让我们开始实现这种效果。为了方便大家理解,我们先来看一下效果图: 主要效果图如下图: 接下来我们看一下程序结构图: MainActivity文件中代码:package com.android.flip;import android.app.Activity;import android.os.Bundle;import android.view.GestureDetector;i...阅读全文
posted @ 2012-02-13 18:04 HarHar 阅读(28674) | 评论 (7) 编辑
 
摘要: 本文介绍Android中实现翻页功能原理及示例。 第一种翻页效果如下: 实现原理: 当前手指触摸点为a,则 a点坐标为(ax,ay), 由三角形acb与三角形cmb为对称三角形并且直线cp为am垂直平分线,则 B点坐标为(ax/2,ay/2)。 作gf垂直于om且cb垂直于am, 三角形cfg与gfm相似,则 cf:gf = gf:mf cf=(gf * gf) / mf gf长度为g点纵坐标 mf长度为g点横坐标 cf长度可求 c点坐标可求 由c点、g点可确定过两点间的直线, 当该直线中x=0时求出与y足交点。 第二种翻页效果 实现原理: 使用贝赛尔曲线。曲线有四个...阅读全文
posted @ 2012-02-13 02:01 HarHar 阅读(3799) | 评论 (0) 编辑
 
摘要: 本示例实现Android通过手势可以实现图像的拖拽功能。运行效果如下: 代码如下: packagecom.android.drag;importandroid.app.Activity;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.os.Bundle;importandroid.util.DisplayMetrics;importandroid.view.MotionEvent.阅读全文
posted @ 2012-02-13 00:12 HarHar 阅读(1207) | 评论 (0) 编辑
 
摘要: 下面的示例是在Android中实现图片3D旋转的效果。实现3D效果一般使用OpenGL,但在Android平台下可以不直接使用OpenGL,而是使用Camera实现,Camera中原理最终还是使用OpenGL,不过使用Camera比较方便。Camera类似一个摄像机,当物体不动时,我们带着摄像机四处移动,在摄像机里面的画面就会有立体感,就可以从其它的角度观看这个物体。废话不多说,直接看示例。运行效果如下:项目结构: MainView.java中代码:packagecom.android.graphics;importandroid.content.Context;importandroid.g阅读全文
posted @ 2012-02-12 02:46 HarHar 阅读(5566) | 评论 (8) 编辑
 
摘要: 本文使用Matrix实现Android实现图片缩放与旋转。示例代码如下:packagecom.android.matrix;importandroid.app.Activity;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.graphics.Matrix;importandroid.graphics.drawable.BitmapDrawable;importandroid.os.Bundle;importandroid.view.ViewGroup.LayoutParams;i阅读全文
posted @ 2012-02-11 01:21 HarHar 阅读(9279) | 评论 (0) 编辑
 
摘要: Android 为我们提供了一个用来绘制图片与动画2D的图像库,这两个包分别是android.graphics.drawable 和 android.view.animation ,在这两个包中可以找到相同的类去呈现绘图与动画的两个不同面。 在这个文档中将介绍如何在你的Android应用程序中使用这个库。我们将讨论基础类Drawable对象如何绘图,如何使用一对Drawable的子类,还有如何去创建图片和动画。 1 Drawable Drawable 是一个通用的抽象类,它的目的是告诉你什么东西是可以画的。你会发现基于Drawable类扩展 出各种绘图的类包括:BitmapDrawable..阅读全文
posted @ 2012-02-11 00:59 HarHar 阅读(1038) | 评论 (0) 编辑
 
摘要: Google开放了Android的源码 。 源码采用Git进行版本控制。 1. 首先,到 http://code.google.com/p/msysgit/downloads/list下载Git-xxx.exe,下载完成后安装Git。 2. Android代码仓库的地址 http://git.source.android.com访问该地址。 可以看到Android项目中,所有的包的列表。 单个包源码的下载方式: 创建目录,运行Git,在Git提供的shell,切换路径到你刚才创建的目录下(cd命令),然后运行下表命令(以common.git为例) git clone git://android阅读全文
posted @ 2013-06-18 17:26  火腿骑士  阅读(195)  评论(0编辑  收藏  举报