android群英传笔记 android动画机制

逐帧动画Frame Animation :其实也可以规划到视图动画的类别,用来一个一个的显示drawable的resources。
视图动画Tween Animation:也叫补间动画,可以在一个视图容器内执行一系列简单变换(位置,大小,旋转,透明度)实现的原理是每次绘制视图时view所在的viewgroup中的drawchild函数获取该viewanimation的transformation值。然后调用canvas.concat()通过矩阵运算完成动画zhen动画帧。如果动画没有完成,就继续调用invalidate函数启动下次绘制来驱动动画,从而完成整个动画的绘制。它有一个缺点,不具备交互性,当某个元素发生视图动画后,其响应事件的位置还依然在动画前的地方,(例如,将一个按钮向右平移10个单位,但是它的点击事件还是在平移之前的那个位置,而不是平移后显示的位置)所以视图动画只能做普通的动画效果,避免交互的发生。但是它的效率高,使用方便。
属性动画Propety Animation:只对android3.0以上的版本才有效,这种动画可以设置给任何object,包括那些还没有渲染到屏幕上的对象,这种动画是可以扩展的,可以让自定义任何类型和属性的动画。
视图动画示例:
public class AnimationActivity extends AppCompatActivity implements View.OnClickListener {

    private ImageView ainmationImg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animation);

        initView();
    }

    private void initView() {
        ainmationImg = ((ImageView) findViewById(R.id.animationImg));
        findViewById(R.id.touming).setOnClickListener(this);
        findViewById(R.id.xuanzhuan).setOnClickListener(this);
        findViewById(R.id.weiyi).setOnClickListener(this);
        findViewById(R.id.suofang).setOnClickListener(this);
        findViewById(R.id.jihe).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.touming:
                toumingAnimation();
                break;
            case R.id.xuanzhuan:
                xuanzhuanAnimation();
                break;
            case R.id.weiyi:
                weiyiAnimation();
                break;
            case R.id.suofang:
                soufangAnimation();
                break;
            case R.id.jihe:
                jiheAnimation();
                break;
        }
    }

    /**
     * 透明动画
     */
    private void toumingAnimation() {
        AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
        alphaAnimation.setDuration(1000);
        ainmationImg.startAnimation(alphaAnimation);
    }

    /**
     * 集合动画,添加多种动画效果
     */
    private void jiheAnimation() {
        AnimationSet as = new AnimationSet(true);
        as.setDuration(1000);

        AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
        alphaAnimation.setDuration(1000);
        as.addAnimation(alphaAnimation);

        ScaleAnimation anmation = new ScaleAnimation(0, 2, 0, 2);
        anmation.setDuration(1000);
        as.addAnimation(anmation);

        RotateAnimation animation = new RotateAnimation(0, 360, 100, 100);
        animation.setDuration(1000);
        as.addAnimation(animation);

        ainmationImg.startAnimation(as);


    }

    /**
     * 缩放动画
     */
    private void soufangAnimation() {
        ScaleAnimation anmation = new ScaleAnimation(0, 2, 0, 2);
        anmation.setDuration(1000);
        ainmationImg.startAnimation(anmation);
    }

    /**
     * 位移动画
     */
    private void weiyiAnimation() {
        TranslateAnimation animation = new TranslateAnimation(0, 200, 0, 300);
        animation.setDuration(1000);
        ainmationImg.startAnimation(animation);
    }

    /**
     * 旋转动画
     */
    private void xuanzhuanAnimation() {
//        参数:1旋转的起始角度和旋转中心点的坐标
        RotateAnimation animation = new RotateAnimation(0, 360, 100, 100);
        animation.setDuration(1000);
        ainmationImg.startAnimation(animation);

    }

    private void animationListener(Animation animation) {
        //动画的监听
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {

            }
            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
    }
}
xml布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_animation"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.lvqueen.qunyinzhuan.day07.AnimationActivity">

    <ImageView
        android:id="@+id/animationImg"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        android:scaleType="fitXY"
        android:src="@mipmap/shoukuan" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:orientation="horizontal">

            <Button
                android:id="@+id/touming"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="透明" />

            <Button
                android:id="@+id/xuanzhuan"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="旋转" />

            <Button
                android:id="@+id/weiyi"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="位移" />

            <Button
                android:id="@+id/suofang"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="缩放" />

        </LinearLayout>

        <Button
            android:id="@+id/jihe"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="集合" />
    </LinearLayout>
</RelativeLayout>
属性动画示例

public class AnimatorActivity extends AppCompatActivity {

    private ImageView imgView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animator);
        initView();
    }

    private void initView() {
        imgView = ((ImageView) findViewById(R.id.animatorImg));
//        pingyiAnimator();
//        jiheAnimator();
//        orderManyAnimator();
        useXmlAnimator();
    }

    /**
     * 在使用ObjectAnimator的时候,操纵的属性必须具有get和set方法,不然ObjectAnimator就无效。
     * 如果没有,可以通过自定义一个属性类或者包装类,来间接的给这个属性增加get,set方法,活着通过ValueAnimator
     * 可以直接使用属性动画的属性值
     * translationX,translationY:为一种增量来控制view对象从它的布局容器的左上角坐标偏移的位置。
     * rotation,rotationX,rotationY:控制view对象围绕它的支点进行2D,3D旋转
     * scaleX,scaleY:控制view围绕它的支点进行2D缩放。
     * pivotX,pivotY:控制view围绕支点进行旋转和缩放变换处理。默认情况下,支点位置就是view对象的中心点
     * x,y:描述了view对象在他的容器中的最终位置,它是最初的左上角坐标和translationX,translationY值的累计和
     * alpha:表示view的透明度,默认值为1不透明,0为完全透明。
     */
    private void pingyiAnimator() {
//        参数1:要操纵的view。参数2:操纵的属性。参数三:可变的数组参数
        ObjectAnimator animator = ObjectAnimator.ofFloat(imgView, "translationX", 300);
//        ObjectAnimator animator = ObjectAnimator.ofFloat(imgView, "translationX", 300);
        animator.setDuration(1000);
        animator.start();
    }


    /**
     * 添加多种动效PropertyValuesHolder
     */
    private void jiheAnimator() {
        PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", 300f);
        PropertyValuesHolder translationY = PropertyValuesHolder.ofFloat("translationY", 300f);
        PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
        ObjectAnimator.ofPropertyValuesHolder(imgView, translationX, scaleX, translationY).setDuration(1000).start();
    }

    /**
     * 顺序添加多种动效
     */
    private void orderManyAnimator() {
        ObjectAnimator animator = ObjectAnimator.ofFloat(imgView, "translationX", 100);
        ObjectAnimator animator1 = ObjectAnimator.ofFloat(imgView, "translationY", 100);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000);
        animatorSet.playTogether(animator, animator1);
        animatorSet.start();

    }


    private void useXmlAnimator(){
//        Animator animator = AnimatorInflater.loadAnimator(this, R.anim.animator_test);
//        animator.setTarget(imgView);
//        animator.start();

    }


//    view 的animate方法添加动画
    private void animateUse(){
        imgView.animate().alpha(0).y(300).setDuration(1000).withStartAction(new Runnable() {
            @Override
            public void run() {

            }
        }).withEndAction(new Runnable() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                    }
                });
            }
        }).start();
    }


    private void valueAnimatorFactory() {
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100);
        valueAnimator.setTarget(imgView);
        valueAnimator.setDuration(1000).start();
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                Float value = (Float) valueAnimator.getAnimatedValue();
//                TODO use the value
//                在这里监听数值的变换,从而完成动画的变换。
            }
        });
    }


    /**
     * 动效的监听
     *
     * @param animator
     */
    private void animationListener(ObjectAnimator animator) {
        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animator) {

            }

            @Override
            public void onAnimationEnd(Animator animator) {

            }

            @Override
            public void onAnimationCancel(Animator animator) {

            }

            @Override
            public void onAnimationRepeat(Animator animator) {

            }
        });
//        通常情况下我们只关心动画结束时,所以还提供了一个,来选择必要的事件进行监听
        animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
            }
        });

    }


}
示例三:布局动画,给子视图出现添加动画

public class BujuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buju);
        addAnimation();
    }

    /**
     * 给子视图出现添加动画
     * 参数1:需要作用的动画,参数2:子view现实的delay时间
     * LayoutAnimationController.ORDER_NORMAL:顺序依次出现
     * LayoutAnimationController.ORDER_RANDOM :随机出现
     * LayoutAnimationController.ORDER_REVERSE:倒序出现
     */
    private void addAnimation() {
        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.activity_buju);
        ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1, 0, 1);
        scaleAnimation.setDuration(1000);
        LayoutAnimationController controller = new LayoutAnimationController(scaleAnimation, 0.5f);
        controller.setOrder(LayoutAnimationController.ORDER_REVERSE);
        linearLayout.setLayoutAnimation(controller);
    }
}

插值器Interpolators

插值器可以定义动画变换速率,类似于物理中的加速度,主要控制目标变量的变化值进行对应的变化。同样的,一个动画变换起始值,在不同的插值器作用下,每个单位时间内所达到的变化值也是不一样的。

自定义动画

示例1:模拟电视机关闭的图像

public class CustomTv extends Animation{
//    缩放的中心点
    private int mCenterWidth;
    private int mCenterHeight;

    private Camera mcamera = new Camera();
    private float mRotateY = 0.0f;

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
//      设置默认时常
        setDuration(1000);
//        动画结束后保留状态
        setFillAfter(true);
//        设置默认插值器
        setInterpolator(new AccelerateInterpolator());
        mCenterWidth = width/2;
        mCenterHeight = height/2;
    }


    public void setRotateY(float rorateY){
        mRotateY = rorateY;
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
//        获得矩阵对象
        final Matrix matrix = t.getMatrix();
//        通过对矩阵的各种操作来实现动效
        matrix.preScale(1,1-interpolatedTime,mCenterWidth,mCenterHeight);
    }
}
使用:

CustomTv customTv = new CustomTv();
customTv.setRotateY(30);
imgView.startAnimation(customTv);

android5.x SVG(可伸缩矢量图形)矢量动画机制

可伸缩矢量图形(scalable vector graphics)

定义用于网络的基于矢量的图形

使用XML格式定义图形

图像在放大或者改变尺寸的情况下其图形质量不会有所损失

万维网联盟的标准

与诸如dom 和xsl之类的问c标准是一个整体

与传统bitmap相比,svg是一个绘图标准,它放大不会失真,而bitmap需要为不同分辨率设计多套图标,矢量图不需要。

它是通过<path>标签创建svg,这些指令一时没看懂,没信心看下去了。


动画特效

一个点击一个按钮,发散出四个按钮的动画,类似于菜单demo

public class SupriseAnimationActivity extends AppCompatActivity implements View.OnClickListener {

    private int[] mRes = {R.id.imageView_a, R.id.imageView_b, R.id.imageView_c, R.id.imageView_d, R.id.imageView_e,};
    private List<ImageView> imageViews = new ArrayList<>();
    private boolean mFlag = true;
    private ImageView imgview;
    private TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_suprise_animation);
        initView();
    }

    private void initView() {

        text = ((TextView) findViewById(R.id.tv_texts));

        for (int i = 0; i < mRes.length; i++) {
            imgview = ((ImageView) findViewById(mRes[i]));
            imgview.setOnClickListener(this);
            imageViews.add(imgview);
        }

    }

    private void startAnim() {
        ObjectAnimator animator = ObjectAnimator.ofFloat(imageViews.get(0), "alpha", 0.5F, 1F);
        ObjectAnimator animator1 = ObjectAnimator.ofFloat(imageViews.get(1), "translationY", -100F);
        ObjectAnimator animator2 = ObjectAnimator.ofFloat(imageViews.get(2), "translationX", -100F);
        ObjectAnimator animator3 = ObjectAnimator.ofFloat(imageViews.get(3), "translationY", 100F);
        ObjectAnimator animator4 = ObjectAnimator.ofFloat(imageViews.get(4), "translationX", 100F);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000);
        animatorSet.setInterpolator(new BounceInterpolator());
        animatorSet.playTogether(animator,animator1,animator2,animator3,animator4);
        animatorSet.start();
        mFlag=false;

    }

    private void stopAnim() {
        ObjectAnimator animator = ObjectAnimator.ofFloat(imageViews.get(0), "alpha", 0.5F, 1F);
        ObjectAnimator animator1 = ObjectAnimator.ofFloat(imageViews.get(1), "translationY", 100F, 0);
        ObjectAnimator animator2 = ObjectAnimator.ofFloat(imageViews.get(2), "translationX", 100F, 0);
        ObjectAnimator animator3 = ObjectAnimator.ofFloat(imageViews.get(3), "translationY", -100F, 0);
        ObjectAnimator animator4 = ObjectAnimator.ofFloat(imageViews.get(4), "translationX", -100F, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000);
        animatorSet.setInterpolator(new BounceInterpolator());
        animatorSet.playTogether(animator,animator1,animator2,animator3,animator4);
        animatorSet.start();
        mFlag=true;

    }


    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.imageView_a:
                if (mFlag) {
                    startAnim();
                } else {
                    stopAnim();
                }
                break;
            default:
                Toast.makeText(getApplicationContext(), view.getId() + "", Toast.LENGTH_LONG).show();
                tvTimer(text);
                break;
        }
    }


    private void tvTimer(final TextView view){
        final ValueAnimator animator = ValueAnimator.ofInt(0,100);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                view.setText("$"+(Integer)animator.getAnimatedValue());
            }
        });
        animator.setDuration(3000);
        animator.start();

    }


}
布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_suprise_animation"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.lvqueen.qunyinzhuan.day08.SupriseAnimationActivity">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView_b"
        android:src="@mipmap/b"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView_c"
        android:src="@mipmap/c"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView_d"
        android:src="@mipmap/d"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView_e"
        android:src="@mipmap/e"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView_a"
        android:src="@mipmap/a"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    <TextView
        android:id="@+id/tv_texts"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test"/>

</RelativeLayout>









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目名称:[精仿]360手机助手-14.2.6更新(CSkin Demo) 界面库版本号:14.2.6 最新版本 下载内容: 精仿360手机助手源码一份, 可引用至工具箱最新版CSkin.dll一份 实现功能: 1.发光标题。 2.直角边框和阴影。 3.360手机助手主界面模仿。 4.多系统支持,不需要win8系统,即可实现win8风格的360手机助手。 5.自定义控件的美化使用。 界面库更新文档: CC2014-2.6 1.修复拖动好友出现的负值BUG和拖动后有机率会消失的问题。 2.好友列表DoubleClickSubItem事件添加回调参数MouseEventArgs,用于判断鼠标操作的一些参数,如:左键双击还是右键双击判断。 3.对SkinDataGridView属性进行部分重构,颜色美化属性增加。 4.窗体加入绘制模式边框颜色属性BorderColor和InnerBorderColor 5.解决SkinTabControl left和right绘制模式下tab标签悬浮样式不变化问题。 6.所有控件采用最高质量模式绘制文字,防止字体模糊以及锯齿。 CC2013-12.8 1.优化SkinTabControl的效率,不再呢么闪烁,360DEMO直接替换DLL,改部分属性小错误,就可以看到明显闪烁减少效果。 2.为SkinStrip分类的控件添加 是否统一变换字体颜色的属性。 3.为SkinAnimatorImg动画图片框控件添加Stretch属性,是否拉伸模式绘制动画。 4.修复SkinComboBox无法DataSource绑定项的BUG。 5.增加音乐播放器,萝莉人物窗体,等DEMO。 6.修复部分细节bug。 提示:窗体继承SkinMain,再设置下SkinBack,有你想不到的惊喜哦,此窗体是用于绘制异形窗体专用,你给他什么图片,窗体就会按照图片来绘制。有一个缺点就是,有透明像素的背景区域,控件不给于显示。 CC2013-10.30 1.由于SkinForm名字太多人使用,界面库命名正式改为CSkin.dll,官网www.cskin.net。 2.SkinTabControl标签中添加菜单箭头,可点击展开菜单。 3.SkinTabControl添加标签关闭按钮。 4.修复部分中文乱码问题。 5.优化好友列表右键菜单。 6.将窗体自定义系统按钮改为集合模式,可添加无数个自定义系统按钮。自定义系统按钮事件中可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画的播放。如360的动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入更加自定义的美化属性和动画效果。 2.添加SkinAnimator,通用动画控件。 3.添加Html编辑器控件 4.修复SkinButton图标和文本相对位置的BUG CC2013-9.26 1.优化好友列表CPU占用 2.好友列表加入好友登录平台属性:安卓 苹果 WEBQQ PC 3.优化标题绘制模式,新添标题绘制模式属性。 4.新添标题偏移度属性。 5.加入圆形进度条控件:ProgressIndicator。 CC2013-9.5.2 1.优化截图控件,截图工具栏加入新功能。 2.解决个人信息卡和天气窗体显示后不会消失的问题。 3.各种细节BUG优化。 CC2013-9.5.1 1.解决贴边左右隐藏的BUG。 2.解决窗体点击事件不能触发的问题。 3.优化SkinButton继承父容器背景色的代码。 4.解决SkinButton异常错误。 CC2013-9.3 1.好友列表右键菜单没反应问题。 2.新增美化控件SkinDatagridview。 3.密码软件盘回删不了文字问题。
CSKIN-15.1.28 1.优化SkinTabControl标签移入移出效果。 2.将SkinTextBox改为容器边框,其他控件可放进其里面。 3.设置SkinTextBox中的TextBox为不可点击,详细参数在属性栏里设置。 4.SkinPanel添加属性(BorderColor:边框颜色)。 5.添加(SkinPushPanel:抽屉控件列表,根据Items添加。)和(SkinCaptionPanel:面板控件单独)。 6.添加(SkinCode:验证码控件。)。 7.减少SkinTreeView的闪烁。 8.窗体XP下最大化移动BUG修复。 9.修复SkinButton的禁止状态绘制不显示的问题。 10.修复SkinDataGridView的一些设置BUG。 11.修复SkinRadioButton属性Text为空报错问题。 12.修复属性(Shadow:是否启用窗体阴影)。 13.加入(日期面板控件:SkinMonthCalendar),(日期选择框控件:SkinDateTimePicker)。 14.加入(弹出承载控件:SkinDropDown) 使用方法: SkinDropDown _SkinDropDown = new SkinDropDown(控件:Control); _SkinDropDown.Show(new Point(0, 22)); 15.添加SystemInformationHelper静态类,获得操作系统版本。 16.添加控件(SkinHotKey:自定义热键注册控件)。 17.窗体添加属性(XTheme:窗体主题,类型:继承CCSkinMain的窗体),增加皮肤更换属性,更好的对换肤支持。 18.增加了MDI支持,并多了一些属性设置MDI。 19.对好友列表进行了绘制优化,效率MAX,真正达到了千人不卡。 20.好友列表添加属性(SmoothScroll:是否平滑滚动),对好友列表加入平滑滚动的效果。 21.修复异形窗体SkinMain不可在透明区域放控件的BUG。 22.好友列表好友拖动效果优化。 23.解决SkinMain异形窗体无法点击触发点击事件问题。 24.修复SkinToolTip的字体颜色及大小BUG。 CSKIN-14.8.26 1.修复SkinPanel滚动条不显示的问题。 2.修复SkinPanel右下边框不显示的问题。 3.修复好友列表头像闪烁的一些BUG。 4.修复SkinMain异形窗体点击任务栏最小化操作。 5.加入内置工具类FastBitmap,此类用来快速Bitmap读写像素,如何使用看:http://bbs.cskin.net/thread-83-1-1.html。 6.修复截图控件的未选框双击错误BUG,增加截图控件属性BmpLayerCurrent:控件所截图的图片。 7.SkinToolStrip添加BaseItemNorml属性,BaseItem默认背景图。 8.修复SkinComboBox下拉框项的细节样式。 9.加入SkinFileTansfersContainer控件与SkinFileTransfersItem控件。 SkinFileTansfersContainer:文件传输列表容器,这里面内置Add,Remove,Search等操作ItemList方法。 SkinFileTransfersItem:文件传输列表项,用于添加进列表容器。 10.SkinToolStrip控件添加BindTabControl=(绑定要操作的TabControl)属性,绑定后点击ToolStripButton就可以根据ToolStripButton中的Tag=(TabPage的Index值)进行切换TabPage。 11.优化设计时SkinTabControl略卡的问题。 12.SkinTabePage添加属性(BorderColor:边框颜色)。 13.修复好友列表闪烁状态下好友被删除,分组依然闪烁。 14.SkinButton、SkinCheckBox、SkinRadioButton添加属性(IsEnabledDraw:是否画禁用状态下的效果,默认true)。 15.好友列表添加三个事件: (DownSubItem:用鼠标按下子项时发生) (UpSubItem:用鼠标按下并释放子项时发生) (ClickSubItem:用鼠标单击子项时发生) 16.SkinTabControl添加两个事件: (TabePageClosed:TabPage容器关闭后。) (TabePageClosing:TabPage容器关闭前。) 17.加入彗星小助手案例DEMO。 CSKIN-14.7.2 1.SkinTabContro
项目名称:[精仿]360安全卫士-10.30更新(CSkin Demo) 界面库版本号:10.30 最新版本 下载内容: 精仿360安全卫士源码一份, 可引用至工具箱最新版CSkin.dll一份 实现功能: 1.发光标题。 2.直角边框和阴影。 3.360安全卫士主界面模仿。 4.多系统支持,不需要win8系统,即可实现win8风格的360。 5.自定义控件的美化使用。 界面库更新文档: CC2013-10.30 1.由于SkinForm名字太多人使用,界面库命名正式改为CSkin.dll,官网www.cskin.net。 2.SkinTabControl标签中添加菜单箭头,可点击展开菜单。 3.SkinTabControl添加标签关闭按钮。 4.修复部分中文乱码问题。 5.优化好友列表右键菜单。 6.将窗体自定义系统按钮改为集合模式,可添加无数个自定义系统按钮。自定义系统按钮事件中可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画的播放。如360的动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入更加自定义的美化属性和动画效果。 2.添加SkinAnimator,通用动画控件。 3.添加Html编辑器控件 4.修复SkinButton图标和文本相对位置的BUG CC2013-9.26 1.优化好友列表CPU占用 2.好友列表加入好友登录平台属性:安卓 苹果 WEBQQ PC 3.优化标题绘制模式,新添标题绘制模式属性。 4.新添标题偏移度属性。 5.加入圆形进度条控件:ProgressIndicator。 CC2013-9.5.2 1.优化截图控件,截图工具栏加入新功能。 2.解决个人信息卡和天气窗体显示后不会消失的问题。 3.各种细节BUG优化。 CC2013-9.5.1 1.解决贴边左右隐藏的BUG。 2.解决窗体点击事件不能触发的问题。 3.优化SkinButton继承父容器背景色的代码。 4.解决SkinButton异常错误。 CC2013-9.3 1.好友列表右键菜单没反应问题。 2.新增美化控件SkinDatagridview。 3.密码软件盘回删不了文字问题。 4.双击窗体最大化,最大化后再双击恢复原大小,(win7)。 5.部分细节调优。 小编:下载不要分,DEMO教你如何熟练使用CSkin界面库美化自己的窗体。 友情链接: http://bbs.csdn.net/topics/390510544 (精仿QQ2013局域通讯) http://download.csdn.net/detail/lyx_520/5710799 (C#实现Win8窗体)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值