这篇文章主要为大家详细介绍了机器人自定义取景器实现滚动效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了自定义视角实现了类似百度手机助手,首页评论滚动效果。
看效果:
可交换的图像格式做的不好,其效果就是:几个查看项目不停的向上滚动,新加入项目有个淡入的效果。
说下实现思路:自定义视角继承至线性布局,控制项目数量及其动画效果,实现项目复用,传入数据即可,使用方便。
代码:
/**
*陶建。杨(姓氏)
*
* @描述仿百度手机助手,评论滚动效果
* @time 2015/1/16 17:37
*/
公共类取景器扩展线性布局{
private final int MAX _ SHOW _ ITEM _ SIZE=5;
私有IAdapter mIAdapter
私有int mCount
//最后一个项目动画
私人动画mLastOneAnimation
//其它项目动画
私人动画mCommonAnimation
//数据下标
私有int mCurrentIndex
/**
* 这里动画时间是1600毫秒,所以间隔得大于动画时间
*/
私有静态final int DEFAULT _ INTERVAL=2000
private int mFlipInterval=DEFAULT _ INTERVAL;
private boolean mAutoStart=false;
私有布尔mRunning=false
私有布尔mStarted=false
私有布尔mVisible=false
私有布尔mUserPresent=true
公共视图鳍状肢(上下文上下文){
超级(上下文);
初始化(上下文);
}
公共视图指示器(上下文上下文,属性集属性){
超级(上下文,attrs);
初始化(上下文);
}
公共视图flipper(Context Context,AttributeSet attrs,int defStyleAttr) {
super(context,attrs,defStyleAttr);
初始化(上下文);
}
专用最终广播接收器mReceiver=新广播接收器(){
@覆盖
公共接收时无效(上下文语境,意图意图){
最终字符串行动=意图。get action();
如果(意图动作_屏幕_关闭。等于(动作)){
mUserPresent=false
更新运行();
} else if(意图动作_用户_当前。等于(动作)){
mUserPresent=true
更新运行(假);
}
}
};
@覆盖
受保护的void onAttachedToWindow() {
超级棒。onattachedtowindow();
//侦听与用户状态相关的广播
最终意图过滤器filter=新意图过滤器();
filter.addAction(Intent .ACTION _ SCREEN _ OFF);
filter.addAction(Intent .ACTION _ USER _ PRESENT);
//好吧,这很恶心,但很有必要。该类由
//远程视图机制,作为远程视图的一部分
//可以由另一个没有应用程序的用户的上下文来放大
//具有交互用户权限-仅用于加载资源。
//例如,将用户配置文件中的小部件添加到
//主屏幕。因此,我们将接收器注册为当前
//用户不是上下文所针对的用户。
getContext()。registerReceiver(mReceiver,filter);
if (mAutoStart) {
//请求时自动启动
开始翻转();
}
}
@覆盖
受保护的void ondechedfromwindow(){
超级棒。ondechedfromwindow();
mVisible=false
getContext()。注销接收者(mReceiver);
更新运行();
}
@覆盖
受保护的void onWindowVisibilityChanged(int visibility){
超级棒。onwindowvisibilitychanged(可见性);
mVisible=visibility==VISIBLE
更新运行(mv isible);
//更新运行(false);
}
私有空的初始化(上下文上下文){
这个。设置方向(线性布局.垂直);
}
public void setIAdapter(IAdapter IAdapter){
这个。mi适配器=I适配器;
initShowItems();
}
public void startFlipping() {
mStarted=true
更新运行();
}
公共void stopFlipping() {
mStarted=false
更新运行();
}
私有void updateRunning() {
更新运行(真);
}
/**
*如果子视图正在翻转,则返回没错。
*/
public boolean isFlipping() {
返回mStarted
}
/**
*设置此视图在以下情况下是否自动调用{@link #startFlipping()}
*贴在窗户上。
*/
public void setAutoStart(布尔自动启动){
mAutoStart=自动启动;
}
/**
*如果此视图自动调用{@link #startFlipping()},则返回真实的
*当它附着在窗户上时。
*/
public boolean isAutoStart() {
返回mAutoStart
}
@覆盖
公共void onInitializeAccessibilityEvent(AccessibilityEvent事件){
超级棒。oninitializeaccessibilityevent(事件);
事件。设置类名(查看flipper。班级。getname());
}
@覆盖
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo){
超级棒。oninitializeaccessibilitynodeinfo(info);
信息。设置类名(查看flipper。班级。getname());
}
/**
* 初始化子视图
*/
私有void initShowItems() {
如果(mIAdapter!=null) {
mCount=mi适配器。get count();
for(int I=0;i mCounti ) {
if (i==MAX_SHOW_ITEM_SIZE) {
打破;
}
view convert view=get child at(I);
查看项目=mi适配器。getitem视图(convert view,I);
addView(item,I);
}
}
}
/**
*基于内部方法启动或停止调度flip {@link android.os.Message}
*在{@link #mRunning}上和{@link #mVisible}状态。
*
* @param flipNow确定是否现在执行动画,在
*除了排队未来翻转。如果省略,则默认为
*没错。
*/
私有void更新正在运行(立即布尔翻转){
布尔running=m visible m started muser present;
系统。出去。println(' update running running:' running ' m visible ' m visible ' user present ' muser present);
如果(跑步!=mRunning) {
如果(正在运行(mCount MAX_SHOW_ITEM_SIZE)) {
showItems(mCurrentIndex,现在翻转);
消息MSG=mhandler。获取消息(FLIP _ MSG);
mhandler。sendmessage延迟(msg,mFlipInterval);
}否则{
mhandler。删除消息(FLIP _ MSG);
}
mRunning=正在运行;
}
}
私有无效显示项目(最终(同Internationalorganizations)国际组织位置,布尔动画){
if(animate(mlastone animation==null | | mCommonAnimation==null)){
mlastone animation=动画工具。加载动画(获取上下文(),r . anim。lastone _ anim);
mCommonAnimation=动画实用程序。加载动画(获取上下文(),r . anim。common _ anim);
}
int子计数=get子计数();
for(int I=0;我数孩子;i ) {
view child=get child at(I);
孩子。清除动画();
int索引=位置我;
child=miadapter。getitemview(child,(index=mIAdapter.getCount())?(索引-miadapter。get count()):index);
如果(动画){
if (i==childCount - 1) {
孩子。设置动画(mlastone动画);
}否则{
孩子。设置动画(mCommonAnimation);
}
}
child.setVisibility(视图。可见);
}
如果(动画){
mcommonanimation。立即开始();
mlastone动画。立即开始();
}
//保证传入的位置小于获取计数
if(mCurrentIndex=mi适配器。get count()){
mCurrentIndex=0;
}
}
private final int FLIP _ MSG=1;
私有最终处理程序mHandler=new Handler() {
@覆盖
公共void handleMessage(消息消息){
if (msg.what==FLIP_MSG) {
if (mRunning) {
showItems(mCurrentIndex,true);
MSG=获取消息(FLIP _ MSG);
sendMessageDelayed(msg,mFlipInterval);
}
}
}
};
公共接口适配器{
/**
* @param convertView
* @param位置
* @返回
*/
public View getitem View(视图转换视图,int位置);
/**
* @返回数据数数
*/
public int getCount();
}
}
再来看看调用部分:
公共类主要活动扩展ActionBarActivity实现视图翻转器.IAdapter {
视图翻转器视图翻转器
@覆盖
受保护的void onCreate(Bundle saved instancestate){
超级棒。oncreate(savedInstanceState);
setContentView(r . layout。活动_主);
view flipper=(view flipper)findViewById(r . id。view _ flipper);
查看脚蹼。setia dapter(这个);
}
@覆盖
受保护的void onResume() {
超级棒。on resume();
查看脚蹼。开始翻转();
}
@覆盖
公共视图getItemView(View convertView,int position) {
视图项目=null
TextView文本视图;
if (convertView==null) {
item=View.inflate(this,R.layout.item,null);
}否则{
item=convertView
}
textView=(textView)item . findviewbyid(r . id . textView);
TextView.setText('测试数据:'位置');
退货项目;
}
@覆盖
public int getCount() {
返回8;
}
}
可以看到MainActivity实现了ViewFlipper。IAdapter接口,设置好适配器后就可以调用startFlipper了。
这里就不贴布局文件了,附上工程源代码。项目里的动画时间有点长,修改一下没问题。
限于水平有限,缺点在所难免。我希望你放弃你的改正,和你一起鼓励我。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。