如何在布局中使右向左的动画

播放列表加载中...
正在载入...
分享视频:
嵌入代码:
拍下二维码,随时随地看视频
象棋乐乐讲棋象棋布局中炮过河车对屏风马左马盘河黑...
上 传 者:
内容介绍:
象棋乐乐讲棋象棋布局中炮过河车对屏风马左马盘河黑右横车式
Channel Me 精选
我来说点啥
版权所有 CopyRight
| 京网文[0号 |
| 京公网安备:
互联网药品信息服务资格证:(京)-非经营性- | 广播电视节目制作经营许可证:(京)字第403号
<img src="" width="34" height="34"/>
<img src=""/>
<li data-vid="">
<img src=""/><i data-vid="" class="ckl_plays">
<li data-vid="">
<img src=""/><i data-vid="" class="ckl_plays">
<img src="///img/blank.png" data-src=""/>
<img src="///img/blank.png" data-src="http://"/>
<li data-vid="" class="cfix">
src="///img/blank.png" data-src=""/>
<i data-vid="" class="ckl_plays">
<li data-vid="" class="cfix">
src="///img/blank.png" data-src=""/><i data-vid="" class="ckl_plays">
没有数据!
{upload_level_name}
粉丝 {fans_count}
{video_count}
{description}中国动漫动画产业布局的转型升级_西安教育吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:358贴子:
中国动漫动画产业布局的转型升级
中国动漫动画产业布局的转型升级“原创动画产量5年来首次出现负增长,去年产量下降近15%。”这是《2013中国动画产业年度发展辑要》公布的最新数据。&负增长&表明从&量&到&质&的升级转型已经开始。”副院长李剑平注意到,一方面电视台对精品动漫产品提高了收购价,一改以前的“白菜价”;另一方面,中国动画在海外屡屡获奖,开始得到国际同行的认可。最重要的是,中国动画“大动漫”的理念将运用到教育、科技等方方面面,为中国动画产业的升级拓展了空间。不仅是年产22万分钟的动漫大国,中国这个年产1.5万集的电视剧第一生产大国,一年500多部电影的电影大国,一年出版37万种图书的第一出版大国,动画产业必须要布局新的转型升级从“大”到“强”,从“量”到“质”,从“有”到“优”。升级就是一个选择和“优胜劣汰”的过程。除了动画产业“降温”外,文化企业上市、主题公园发展和园区建设也都在回归理性:据统计,截至4月中旬,已经有18创意企业撤回上市材料,但文化产业新募集的专项资金规模已超过160亿元人民币。“园区&热&开始降温,人们在反思,不能照搬工业园区的方法搞。”国家文化产业创新与发展研究基地办公室主任教授提醒,文化产业有自己的发展规律,要从对土地和房子的重视,转向对创意的扶持。回望过去一年,增加值依然保持20%以上的增速,文化骨干企业向做大做强迈进,总体实力增强,105家中央文化企业主要经济指标同比实现两位数增长。方兴未艾的文化产业还将在提升国家软实力和经济发展方式转型中发挥更重要的作用升级转型,是为了迎接新的腾飞。 西安汇众动漫游戏学院确实不错,是国内动漫游戏院校里面的佼佼者,各方面的条件都很成熟,西安汇汇总动漫学院作为国内大型企业办学,拥有十年的办学历史,其师资,环境,教学设备和企业实训及就业都是国内公认的实力最好最强的动漫游戏培训学校。想了解详细的课程可以加课程老师QQ:详细了解
内&&容:使用签名档&&
保存至快速回贴
为兴趣而生,贴吧更懂你。&或&&&&&&&&&&&
无意中搜索到这篇文章,大概扫了一眼,知道是篇好文,先转载记录下来学习!
文章主要讲的是自定义view的写法心得。
在android应用程序的开发过程中,相信我们很多人都想把应用的交互做的比较绚丽,比如让界面切换平滑的滚动,还有热度灰常高的伪3D等界面效果,通常情况下,系统提供的应用在特效这方面只能为我们提供简单的动画接口,所以要想实现比较酷炫的效果还是要自己去开发布局控件(即所谓的自定义View、ViewGroup)。小弟也经常做一些自定义的控件,最近工作比较清闲,所以便将自己对自定义布局控件的一些心得写出来,权当是自己的学习笔记了,各位高手看到了可以忽略。下面就我最近工作中遇到的一个自定义控件开发做一些简单的介绍,其实那个地方原本可以用ScrollView解决很大一部分问题的,但有一些效果确实需要对控件进行重新定义,在继承ScrollView开发中仍然会遇到一些ScrollView自身的限制,所以就仿照ScrollView自己做了一个控件。在其中遇到了一些问题自然就是像ScrollView中拖动的效果(比如快速拖动在手指离开屏幕时控件依旧会由于惯性继续滑动一段距离后才会停止运动),所以就对这个东东做了一下仔细的研究,虽然以前也做过类似的开发,这次由于时间比较充裕,所以将开发中遇到的一些问题都一一记录了下来。下面开始正题:
自定义布局控件自然是要继承某个View或ViewGroup
由于是根据项目的开发来写的这篇博客,所以我就以自定义布局控件(ViewGroup)来做介绍了。
开发一个自定义的ViewGroup自然是要继承ViewGroup类了,在继承这个类之后必须要重写的方法就是
onLayout(boolean changed, int l, int t, int r, int b)
另外至少要有一个构造方法,我个人习惯重写那个有两个参数的构造方法(XXX(Context context, AttributeSet attrs)),因为有了这个构造方法就可以在xml布局文件里使用这个类了。
如果想要对这个布局控件以及其子控件的尺寸进行精确的控制那就要重写下面这个方法了
onMeasure(int widthMeasureSpec, int heightMeasureSpec)
这个方法从字面理解就是估算控件的尺寸大小了,关于这个方法的详细说明引用一下另一位童鞋的文章,这里就不详细介绍了
下面开始介绍关于如何让自定义的控件进行平滑的移动,并能够根据手势的情况产生惯性滑动的效果
先介绍一下开发这种滑动效果需要用到的各种工具类:
android.view.VelocityTracker
android.view.Scroller
android.view.ViewConfiguration
VelocityTracker从字面意思理解那就是速度追踪器了,在滑动效果的开发中通常都是要使用该类计算出当前手势的初始速度(不知道我这么理解是否正确,对应的方法是<puteCurrentVelocity(1000, mMaximumVelocity))并通过getXVelocity或getYVelocity方法得到对应的速度值initialVelocity,并将获得的速度值传递给Scroller类的fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY)&方法进行控件滚动时各种位置坐标数值的计算,API中对fling&方法的解释是基于一个fling手势开始滑动动作,滑动的距离将由所获得的初始速度initialVelocity来决定。关于ViewConfiguration&的使用主要使用了该类的下面三个方法:
configuration.getScaledTouchSlop()&//获得能够进行手势滑动的距离configuration.getScaledMinimumFlingVelocity()//获得允许执行一个fling手势动作的最小速度值configuration.getScaledMaximumFlingVelocity()//获得允许执行一个fling手势动作的最大速度值
需要重写的方法至少要包含下面几个方法:
onTouchEvent(MotionEvent event)//有手势操作必然少不了这个方法了
computeScroll()//必要时由父控件调用请求或通知其一个子节点需要更新它的mScrollX和mScrollY的值。典型的例子就是在一个子节点正在使用Scroller进行滑动动画时将会被执行。所以,从该方法的注释来看,继承这个方法的话一般都会有Scroller对象出现。
在往下就是介绍比较具体的开发思路
首先我们要初始化一些变量,其中的多数代码已经在上面做出介绍了
void init(Context context) {
mScroller = new Scroller(getContext());
setFocusable(true);
setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
setWillNotDraw(false);
final ViewConfiguration configuration = ViewConfiguration.get(context);
mTouchSlop = configuration.getScaledTouchSlop();
mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
然后我们申明一个用来处理滑动操作的方法fling(int velocityY),代码如下:
public void fling(int velocityY) {
if (getChildCount() & 0) {
mScroller.fling(getScrollX(), getScrollY(), 0, velocityY, 0, 0, 0,
maxScrollEdge);
final boolean movingDown = velocityY & 0;
awakenScrollBars(mScroller.getDuration());
invalidate();
在这个方法里只是使用Scroller的fling方法开始执行fling手势动作了,关于其中的各种参数就不一一解释了。
awakenScrollBars(int startDelay)方法根据我对注释的理解就是在这里给出动画开始的延时,当参数startDelay为0时动画将立刻开始,其实就是一个延迟的作用
下面是对VelocityTracker的初始化以及资源释放的方法
private void obtainVelocityTracker(MotionEvent event) {
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(event);
private void releaseVelocityTracker() {
if (mVelocityTracker != null) {
mVelocityTracker.recycle();
mVelocityTracker = null;
onTouchEvent(MotionEvent event)方法的重写
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN
&& event.getEdgeFlags() != 0) {
return false;
obtainVelocityTracker(event);
final int action = event.getAction();
final float x = event.getX();
final float y = event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
LogUtil.log(TAG, "ACTION_DOWN#currentScrollY:" + getScrollY()
+ ", mLastMotionY:" + mLastMotionY,
LogUtil.LOG_E);
if (!mScroller.isFinished()) {
mScroller.abortAnimation();
mLastMotionY =
case MotionEvent.ACTION_MOVE:
final int deltaY = (int) (mLastMotionY - y);
mLastMotionY =
if (deltaY & 0) {
if (getScrollY() & 0) {
scrollBy(0, deltaY);
} else if (deltaY & 0) {
mIsInEdge = getScrollY() &= childTotalHeight -
if (mIsInEdge) {
scrollBy(0, deltaY);
case MotionEvent.ACTION_UP:
final VelocityTracker velocityTracker = mVelocityT
puteCurrentVelocity(1000, mMaximumVelocity);
int initialVelocity = (int) velocityTracker.getYVelocity();
if ((Math.abs(initialVelocity) & mMinimumVelocity)
&& getChildCount() & 0) {
fling(-initialVelocity);
releaseVelocityTracker();
return true;
在onTouchEvent方法中,当手势执行到ACTION_UP时获得当时手势的速度值然后判断这个速度值是否大于可滑动的最小速度,如果符合条件那么就执行fling(int velocityY)方法,通过fling方法中的日志发现,在执行了invalidate()方法之后,程序便会执行computeScroll()方法,在computeScroll()方法中执行scrollTo方法主要是因为mScrollX、mScrollY这两个变量的修饰符为portected,无法在扩展类里面无法对这两个变量直接进行操作,那么就需要使用scrollTo方法对这两个变量进行操作,以刷新当前的UI控件,下面附上computeScroll()方法的代码
public void computeScroll() {
if (puteScrollOffset()) {
int scrollX = getScrollX();
int scrollY = getScrollY();
int oldX = scrollX;
int oldY = scrollY;
int x = mScroller.getCurrX();
int y = mScroller.getCurrY();
scrollY = scrollY + 10;
scrollTo(scrollX, scrollY);
postInvalidate();
其中的puteScrollOffset()是用来判断动画是否完成,如果没有完成返回true继续执行界面刷新的操作,各种位置信息将被重新计算用以重新绘制最新状态的界面。关于scrollTo方法,我们需要看一下该方法的代码(来自View中):
public void scrollTo(int x, int y) {
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX =
mScrollY =
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
invalidate();
我们可以看到,当传递进来的x、y的值与控件当前的mScrollX、mScrollY的值不相同时对界面进行重新计算,根据日志打印的情况来看似乎awakenScrollBars()返回的总是true, 这样的话每执行一次computeScroll()方法,就需要执行一次postInvalidate()方法来刷新界面,而postInvalidate()方法会通过内部线程重新调用invalidate()已达到界面刷新的效果,产生手势离开屏幕之后的惯性滑动效果。
可能上面说的比较凌乱,在这里总结一下,大概的思路如下:
首先我们通过VelocityTracker、ViewConfiguration类得到一些惯性滑动所必须的变量,比如手势离开屏幕时的初始速度,允许进行手势操作的最小距离以及允许手势操作的速度边界值;
第二,创建Scroller的对象,使用它的fling方法供我们控制界面滑动使用;
第三,重写onTouchEvent方法,当我们用手指在屏幕上来回滑动时此时执行的是scrollBy方法来刷新界面,当手指离开屏幕,此时就要开始执行ACTION_UP后面的操作了;
通过对手指离开屏幕时的速度进行判断是否能够进行惯性滑动操作,
如果能够执行那么就使用Scroller类的fling方法启动滑动动画,
这时需要调用一下invalidate()方法来间接的调用computeScroll方法,
在computeScroll方法中对Scroller的动画是否执行完成做了判断,
如果动画没有完成(<puteScrollOffset() == true)那么就使用scrollTo方法对mScrollX、mScrollY的值进行重新计算刷新界面,
调用postInvalidate()方法重新绘制界面,
postInvalidate()方法会调用invalidate()方法,
invalidate()方法又会调用computeScroll方法,
就这样周而复始的相互调用,直到<puteScrollOffset()&返回false才会停止界面的重绘动作
总结,滑动效果来看,它依然是在不停的计算控件的位置刷新屏幕,不停的绘制新的图片替换旧的图片,当然每次刷新的速度很快,从而给人一种是在快速滑动的感觉,写到这里我发现,现在所谓的动画总是逃脱不了电影的那种模式,每秒播放多少帧的图片来达到连续播放的效果欺骗人的眼睛。
而且,关于android一些酷炫效果的开发,还是要自己多动手,熟悉View、ViewGroup中每个绘制方法、位置计算方法的调用方式以及顺序,那么至少是在2D动画开发中,也就是一种方式,逃脱不了不停重新绘制的这个圈。
关于熟悉View、ViewGroup中每个绘制方法、位置计算方法的调用方式以及顺序的问题,我建议最好自己写一个简单的自定义View或ViewGroup的扩展类,重载那些绘制、位置计算的方法打个日志出来一看自然就明白了,虽然这个方法很笨,但是很容易出效果的
阅读(...) 评论()视频: 象棋乐乐象棋布局中炮过河车对屏风马左马盘河黑飞右象红冲中兵式
分享给好友
您需要先安装&,才能下载视频哦
用优酷App或微信扫一扫,在手机上继续观看。
象棋乐乐象棋布局中炮过河车对屏风马左马盘河黑飞右象红冲中兵式
分享给站外好友
把视频贴到Blog或BBS
flash地址:
<input type="text" class="form_input form_input_s" id="link3" value=''>
<input id="link4" type="text" class="form_input form_input_s" value=''>
节目制作经营许可证京字670号
京公网安备号
药品服务许可证(京)-经营-}

我要回帖

更多关于 easyui左右布局 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信