1115笔记

本文介绍如何使用Android的Camera和Matrix类实现3D旋转动画效果,包括创建旋转动画、设置旋转中心点及调整旋转速度等内容。

这里写图片描述
这里写图片描述
预备知识:
android:interpolator

Interpolator 被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复),bounced(弹跳)等。
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速(今天用到这个)
android.graphics包里的Camera,可以理解为2D图形系统中的视角,或者照相机的机位,根据透视的原理我们可以实现一些简单的3D效果
camera的坐标系是左手坐标系。伸出左手,让拇指和食指成L形,大拇指向右,食指向上,中指指向前方,这样我们就建立了一个左手坐标系,拇指,食指,中指的指向分别代表了x,y,z轴的正方向。如下图所示:
这里写图片描述
1,camera位于坐标点(0,0),也就是视图的左上角;

2,camera.translate(10, 20, 30)的意思是把观察物体右移10,上移20,向前移30(即让物体远离camera,这样物体将会变小);
3,camera.rotateX(45)的意思是绕x轴顺时针旋转45度。举例来说,如果物体中间线和x轴重合的话,绕x轴顺时针旋转45度就是指物体上半部分向里翻转,下半部分向外翻转;
4,camera.rotateY(45)的意思是绕y轴顺时针旋转45度。举例来说,如果物体中间线和y轴重合的话,绕y轴顺时针旋转45度就是指物体右半部分向里翻转,左半部分向外翻转;
5,camera.rotateZ(45)的意思是绕z轴顺时针旋转45度。举例来说,如果物体中间线和z轴重合的话,绕z轴顺时针旋转45度就是指物体上半部分向左翻转,下半部分向右翻转;

Matrix:
等补图,服务器挂了

matrix.setScale(interpolatedTime, interpolatedTime);
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);

经常在中心缩放的应用中看到这段代码.

preTranslate是指在setScale前,平移,postTranslate是指在setScale后平移
注意他们参数是平移的距离,而不是平移目的地的坐标!

由于缩放是以(0,0)为中心的,所以为了把界面的中心与(0,0)对齐,就要preTranslate(-centerX, -centerY),
setScale完成后,调用postTranslate(centerX, centerY),再把图片移回来,这样看到的动画效果就是activity的界面图片从中心不停的缩放了

注:centerX和centerY是界面中心的坐标

velocity速率,速度; 周转率; 高速,快速;

好了可以直接看代码了

package com.com.fish.transaticontest;

import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.Transformation;

/**
 * Created by Administrator on 2015/11/14.
 * api demo自带的工具类
 */
public class Rotate3dAnimation extends Animation {
    private final float mFromDegrees;
    private final float mToDegrees;
    private final float mCenterX;
    private final float mCenterY;
    private final float mDepthZ;
    private final boolean mReverse;
    private Camera mCamera;

    /**
     * Creates a new 3D rotation on the Y axis. The rotation is defined by its
     * start angle and its end angle. Both angles are in degrees. The rotation
     * is performed around a center point on the 2D space, definied by a pair
     * of X and Y coordinates, called centerX and centerY. When the animation
     * starts, a translation on the Z axis (depth) is performed. The length
     * of the translation can be specified, as well as whether the translation
     * should be reversed in time.
     *
     * @param fromDegrees the start angle of the 3D rotation
     * @param toDegrees the end angle of the 3D rotation
     * @param centerX the X center of the 3D rotation
     * @param centerY the Y center of the 3D rotation
     * @param reverse true if the translation should be reversed, false otherwise
     */
    public Rotate3dAnimation(float fromDegrees, float toDegrees,
                             float centerX, float centerY, float depthZ, boolean reverse) {
        mFromDegrees = fromDegrees;
        mToDegrees = toDegrees;
        mCenterX = centerX;
        mCenterY = centerY;
        mDepthZ = depthZ;
        mReverse = reverse;
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        mCamera = new Camera();
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final float fromDegrees = mFromDegrees;
        float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);

        final float centerX = mCenterX;
        final float centerY = mCenterY;
        final Camera camera = mCamera;

        final Matrix matrix = t.getMatrix();

        camera.save();
        if (mReverse) {//意思是是否要反转
            camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime*2);
        } else {
            camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
        }
        camera.rotateY(degrees);//绕y轴旋转,主要影响xoy平面
        camera.getMatrix(matrix);//把matrix复制进去
        camera.restore();//恢复
        /**preTranslate是指在setScale前,平移,postTranslate是指在setScale后平移
         注意他们参数是平移的距离,而不是平移目的地的坐标!

         由于缩放是以(0,0)为中心的,所以为了把界面的中心与(0,0)对齐,就要preTranslate(-centerX, -centerY),
         setScale完成后,调用postTranslate(centerX, centerY),再把图片移回来,这样看到的动画效果就是activity的界面图片从中心不停的缩放了

         注:centerX和centerY是界面中心的坐标*/
        matrix.preTranslate(-centerX, -centerY);
        matrix.postTranslate(centerX, centerY);
    }
}
public class PictureAdapter extends ArrayAdapter<Picture> {

    public PictureAdapter(Context context, int textViewResourceId, List<Picture> objects) {
        super(context, textViewResourceId, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Picture picture = getItem(position);
        View view;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_1,//就只有一个TextView
                    null);
        } else {
            view = convertView;
        }
        TextView text1 = (TextView) view.findViewById(android.R.id.text1);
        text1.setText(picture.getName());
        return view;
    }

}
public class Picture {

    /**
     * 图片名称
     */
    private String name;

    /**
     * 图片对象的资源
     */
    private int resource;

    public Picture(String name, int resource) {
        this.name = name;
        this.resource = resource;
    }

    public String getName() {
        return name;
    }

    public int getResource() {
        return resource;
    }

package com.com.fish.transaticontest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;

import com.example.qqlike.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2015/11/14.
 */
public class MainActivity extends Activity {

    /**
     * 根布局
     */
    private RelativeLayout layout;

    /**
     * 用于展示图片列表的ListView
     */
    private ListView picListView;

    /**
     * 用于展示图片详细的ImageView
     */
    private ImageView picture;

    /**
     * 图片列表的适配器
     */
    private PictureAdapter adapter;

    /**
     * 存放所有图片的集合
     */
    private List<Picture> picList = new ArrayList<Picture>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.transcation_main);
        // 对图片列表数据进行初始化操作
        initPics();
        layout = (RelativeLayout) findViewById(R.id.layout);
        picListView = (ListView) findViewById(R.id.pic_list_view);
        picture = (ImageView) findViewById(R.id.picture);
        adapter = new PictureAdapter(this, 0, picList);
        picListView.setAdapter(adapter);
        picListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // 当点击某一子项时,将ImageView中的图片设置为相应的资源
                picture.setImageResource(picList.get(position).getResource());
                // 获取布局的中心点位置,作为旋转的中心点
                float centerX = layout.getWidth() / 2f;
                float centerY = layout.getHeight() / 2f;
                // 构建3D旋转动画对象,旋转角度为0到90度,这使得ListView将会从可见变为不可见
                final Rotate3dAnimation rotation = new Rotate3dAnimation(0, 90, centerX, centerY,
                        310.0f, true);
                // 动画持续时间500毫秒
                rotation.setDuration(1000);
                // 动画完成后保持完成的状态
                rotation.setFillAfter(true);
                rotation.setInterpolator(new AccelerateInterpolator());//在动画开始的地方速率改变比较慢,然后开始加速
                // 设置动画的监听器
                rotation.setAnimationListener(new TurnToImageView());
                layout.startAnimation(rotation);
            }
        });
        picture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 获取布局的中心点位置,作为旋转的中心点
                float centerX = layout.getWidth() / 2f;
                float centerY = layout.getHeight() / 2f;
                // 构建3D旋转动画对象,旋转角度为360到270度,这使得ImageView将会从可见变为不可见,并且旋转的方向是相反的
                final Rotate3dAnimation rotation = new Rotate3dAnimation(360, 270, centerX,
                        centerY, 310.0f, true);
                // 动画持续时间500毫秒
                rotation.setDuration(1000);
                // 动画完成后保持完成的状态
                rotation.setFillAfter(true);
                rotation.setInterpolator(new AccelerateInterpolator());
                // 设置动画的监听器
                rotation.setAnimationListener(new TurnToListView());
                layout.startAnimation(rotation);
            }
        });
    }

    /**
     * 初始化图片列表数据。
     */
    private void initPics() {
        Picture bird = new Picture("Bird", R.drawable.p1);
        picList.add(bird);
        Picture winter = new Picture("Winter", R.drawable.p2);
        picList.add(winter);
        Picture autumn = new Picture("Autumn", R.drawable.p7);
        picList.add(autumn);
        Picture greatWall = new Picture("Great Wall", R.drawable.p8);
        picList.add(greatWall);
        Picture waterFall = new Picture("Water Fall", R.drawable.zhou7);
        picList.add(waterFall);
    }

    /**
     * 注册在ListView点击动画中的动画监听器,用于完成ListView的后续动画。
     *
     * @author guolin
     */
    class TurnToImageView implements Animation.AnimationListener {

        @Override
        public void onAnimationStart(Animation animation) {
        }

        /**
         * 当ListView的动画完成后,还需要再启动ImageView的动画,让ImageView从不可见变为可见
         */
        @Override
        public void onAnimationEnd(Animation animation) {
            // 获取布局的中心点位置,作为旋转的中心点
            float centerX = layout.getWidth() / 2f;
            float centerY = layout.getHeight() / 2f;
            // 将ListView隐藏
            picListView.setVisibility(View.GONE);
            // 将ImageView显示
            picture.setVisibility(View.VISIBLE);
            picture.requestFocus();
            // 构建3D旋转动画对象,旋转角度为270到360度,这使得ImageView将会从不可见变为可见
            final Rotate3dAnimation rotation = new Rotate3dAnimation(270, 360, centerX, centerY,
                    310.0f, false);
            // 动画持续时间500毫秒
            rotation.setDuration(500);
            // 动画完成后保持完成的状态
            rotation.setFillAfter(true);
            rotation.setInterpolator(new AccelerateInterpolator());
            layout.startAnimation(rotation);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

    }

    /**
     * 注册在ImageView点击动画中的动画监听器,用于完成ImageView的后续动画。
     *
     * @author guolin
     */
    class TurnToListView implements Animation.AnimationListener {

        @Override
        public void onAnimationStart(Animation animation) {
        }

        /**
         * 当ImageView的动画完成后,还需要再启动ListView的动画,让ListView从不可见变为可见
         */
        @Override
        public void onAnimationEnd(Animation animation) {
            // 获取布局的中心点位置,作为旋转的中心点
            float centerX = layout.getWidth() / 2f;
            float centerY = layout.getHeight() / 2f;
            // 将ImageView隐藏
            picture.setVisibility(View.GONE);
            // 将ListView显示
            picListView.setVisibility(View.VISIBLE);
            picListView.requestFocus();
            // 构建3D旋转动画对象,旋转角度为90到0度,这使得ListView将会从不可见变为可见,从而回到原点
            final Rotate3dAnimation rotation = new Rotate3dAnimation(90, 0, centerX, centerY,
                    310.0f, false);
            // 动画持续时间500毫秒
            rotation.setDuration(500);
            // 动画完成后保持完成的状态
            rotation.setFillAfter(true);
            rotation.setInterpolator(new AccelerateInterpolator());
            layout.startAnimation(rotation);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

    }

}
Java是一种具备卓越性能与广泛平台适应性的高级程序设计语言,最初由Sun Microsystems(现属Oracle公司)的James Gosling及其团队于1995年正式发布。该语言在设计上追求简洁性、稳定性、可移植性以及并发处理能力,同时具备动态执行特性。其核心特征与显著优点可归纳如下: **平台无关性**:遵循“一次编写,随处运行”的理念,Java编写的程序能够在多种操作系统与硬件环境中执行,无需针对不同平台进行修改。这一特性主要依赖于Java虚拟机(JVM)的实现,JVM作为程序与底层系统之间的中间层,负责解释并执行编译后的字节码。 **面向对象范式**:Java全面贯彻面向对象的设计则,提供对封装、继承、多态等机制的完整支持。这种设计方式有助于构建结构清晰、模块独立的代码,提升软件的可维护性与扩展性。 **并发编程支持**:语言层面集成了多线程处理能力,允许开发者构建能够同时执行多项任务的应用程序。这一特性尤其适用于需要高并发处理的场景,例如服务器端软件、网络服务及大规模分布式系统。 **自动内存管理**:通过内置的垃圾回收机制,Java运行时环境能够自动识别并释放不再使用的对象所占用的内存空间。这不仅降低了开发者在内存管理方面的工作负担,也有效减少了因手动管理内存可能引发的内存泄漏问题。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think> 我们正在比较Intel Celeron N5105和Intel Core i3-1115G4两款处理器。根据引用内容和我掌握的知识,我将从参数、性能和应用场景三个方面进行对比分析。 ### 一、核心参数对比 | **参数** | **Celeron N5105** [^1][^3] | **Core i3-1115G4** [^2] | |------------------|-----------------------------------|-------------------------------------| | **架构** | Jasper Lake (10nm) | Tiger Lake (10nm SuperFin) | | **核心/线程** | 4核4线程 | 2核4线程(支持超线程) | | **基础频率** | 2.0 GHz | 3.0 GHz | | **睿频加速** | 最高2.9 GHz | 最高4.1 GHz | | **缓存** | 4MB L3 | 6MB L3 | | **TDP** | 10W (可配置4.8-10W) | 15-28W (可配置) | | **核显** | UHD Graphics (24EU, 800MHz) | UHD Graphics (48EU, 1.25GHz) | | **内存支持** | DDR4-2933/LPDDR4x-2933 | DDR4-3200/LPDDR4x-3733 | | **PCIe版本** | PCIe 3.0 (8通道) | PCIe 4.0 (16通道) | | **媒体引擎** | 支持4K60 AV1/VP9解码 | 支持4K60 AV1/VP9解码 | > **关键差异**: > - i3-1115G4具备更强的单核性能(睿频4.1GHz vs 2.9GHz) > - N5105拥有物理四核优势,但缺少超线程技术 > - i3核显性能是N5105的2倍以上(48EU@1.25GHz vs 24EU@800MHz) ### 二、性能实测对比(参考PassMark数据) ```mermaid bar title 处理器综合性能对比(PassMark分数) "单核性能" : i3-1115G4 2680, N5105 1580 "多核性能" : i3-1115G4 5200, N5105 3800 "核显性能" : i3-1115G4 1450(G3D Mark), N5105 610 ``` > **性能解读**: > - 单核任务(如办公软件):i3领先约70% [^性能依据] > - 多核负载(如多任务处理):i3领先约37%,尽管核心数少但超线程和缓存优势明显 > - 图形处理:i3核显性能是N5105的2.4倍,可流畅运行《英雄联盟》等游戏 ### 三、能效与散热表现 $$ \text{能效比} = \frac{\text{性能}}{\text{功耗}} $$ - **N5105优势场景**: - 低负载功耗:待机0.5W vs i3的1.2W - 10W TDP下持续输出性能更强(适合无风扇设计) - **i3-1115G4优势**: - 高负载能效高:28W状态下性能可达N5105的2倍 - 支持动态调频(Speed Shift技术响应更快) ### 四、典型应用场景推荐 | **需求场景** | **推荐处理器** | **理由** | |-----------------------|----------------------|--------------------------------------------------------------------------| | 工业边缘计算网关 | N5105 [^1] | 10W低功耗、宽温支持(-20°C~70°C),成本低 | | 家庭NAS设备 | N5105 [^3] | 10W TDP适合24小时运行,支持2.5G网卡 | | 轻薄办公笔记本 | i3-1115G4 | 高频+超线程提升Office/浏览器流畅度,雷电4接口扩展性强 [^2] | | 教育终端平板 | N5105 | 被动散热无噪音,成本控制在$300以内 | | 入门级游戏主机 | i3-1115G4 | 核显可玩主流网游,PCIe 4.0支持高速SSD | > **引用实例**: > - **边缘计算**:引用[1]指出N5105适用于嵌入式设备(≤13B参数模型推理) > - **企业终端**:引用[2]显示类似i3的处理器通过vPro技术实现远程管理 > - **NAS方案**:引用[3]证实N5105在威联通TS-453Dmini中提供2.5G网络支持 ### 五、兼容性与扩展性 - **平台差异**: ```mermaid graph LR A[N5105平台] --> B[低成本] A --> C[仅PCIe 3.0] A --> D[无雷电接口] E[i3-1115G4平台] --> F[双雷电4] E --> G[PCIe 4.0x4 SSD] E --> H[vPro企业功能] ``` > - i3支持更快的存储(PCIe 4.0 SSD读取>5000MB/s vs N5105的2000MB/s) > - N5105更适合固定功能设备(如NAS/工控机),无需高速扩展 ### 六、选购决策树 ```mermaid graph TD A[需求类型?] A --> B{高性能场景?} B --> |是| C[i3-1115G4] B --> |否| D{低功耗要求?} D --> |是| E[N5105] D --> |否| F{预算限制?} F --> |<¥3000| E F --> |>¥4000| C ``` §§相关问题§§ 1. N5105能否胜任4K视频播放? 2. i3-1115G4支持的最大内存容量是多少? 3. 无风扇设计更适合哪款处理器? 4. 两款处理器在Docker容器中的性能差异? [^性能依据]: PassMark CPU Benchmark (2023 Q3数据) [^1]: 边缘硬件兼容性矩阵 [^2]: NUC13 Pro机型参数 [^3]: 威联通TS-453Dmini规格 </think> 以下是 Intel Celeron N5105 和 Intel Core i3-1115G4 两款处理器的详细对比分析(基于引用内容和技术参数): --- ### **核心参数对比** | **参数** | **Celeron N5105** [^1][^3] | **Core i3-1115G4** [^2] | |------------------|-----------------------------------|-------------------------------------| | **架构** | Jasper Lake (10nm) | Tiger Lake (10nm SuperFin) | | **核心/线程** | 4核4线程 | 2核4线程(支持超线程) | | **基础频率** | 2.0 GHz | 3.0 GHz | | **睿频加速** | 最高2.9 GHz | 最高4.1 GHz | | **缓存** | 4MB L3 | 6MB L3 | | **TDP** | 10W (可配置4.8-10W) | 15-28W (可配置) | | **核显** | UHD Graphics (24EU, 800MHz) | UHD Graphics (48EU, 1.25GHz) | | **内存支持** | DDR4-2933/LPDDR4x-2933 | DDR4-3200/LPDDR4x-3733 | | **PCIe版本** | PCIe 3.0 (8通道) | PCIe 4.0 (16通道) | | **媒体引擎** | 支持4K60 AV1/VP9解码 | 支持4K60 AV1/VP9解码 | > **关键差异**: > - i3-1115G4具备更强的单核性能(睿频4.1GHz vs 2.9GHz) > - N5105拥有物理四核优势,但缺少超线程技术 > - i3核显性能是N5105的2倍以上(48EU@1.25GHz vs 24EU@800MHz) --- ### **性能实测对比(基于行业数据)** ```mermaid bar title 处理器综合性能对比(PassMark分数) "单核性能" : i3-1115G4 2680, N5105 1580 "多核性能" : i3-1115G4 5200, N5105 3800 "核显性能" : i3-1115G4 1450(G3D Mark), N5105 610 ``` > **性能解读**: > 1. **计算任务**: > - 单核负载(如Office办公):i3领先约70% > - 多核负载(如视频转码):i3领先约37%(超线程弥补核心数劣势) > 2. **图形任务**: > - N5105:1080P视频播放/轻度图形处理 > - i3-1115G4:可流畅运行《英雄联盟》等网游(核显性能2.4倍于N5105) --- ### **能效与功耗控制** $$ \text{能效比} = \frac{\text{性能}}{\text{功耗}} $$ - **N5105优势**: - 低负载功耗:待机0.5W vs i3的1.2W - 10W TDP下持续输出性能更强(适合无风扇设计) - **i3-1115G4优势**: - 高负载能效高:28W状态下性能可达N5105的2倍 - 支持动态调频(Speed Shift技术响应更快) --- ### **典型应用场景推荐** | **需求场景** | **推荐处理器** | **理由** | |-----------------------|----------------------|--------------------------------------------------------------------------| | 工业边缘计算网关 | N5105 [^1] | 10W低功耗、宽温支持(-20°C~70°C),成本低 | | 家庭NAS设备 | N5105 [^3] | 10W TDP适合24小时运行,支持2.5G网卡 | | 轻薄办公笔记本 | i3-1115G4 | 高频+超线程提升Office/浏览器流畅度,雷电4接口扩展性强 [^2] | | 教育终端平板 | N5105 | 被动散热无噪音,成本控制在$300以内 | | 入门级游戏主机 | i3-1115G4 | 核显可玩主流网游,PCIe 4.0支持高速SSD | > **引用实例**: > - **边缘计算**:引用[1]指出N5105适用于嵌入式设备(≤13B参数模型推理) > - **企业终端**:引用[2]显示类似i3的处理器通过vPro技术实现远程管理 > - **NAS方案**:引用[3]证实N5105在威联通TS-453Dmini中提供2.5G网络支持 --- ### **平台扩展性对比** ```mermaid graph LR A[N5105平台] --> B[低成本] A --> C[仅PCIe 3.0] A --> D[无雷电接口] E[i3-1115G4平台] --> F[双雷电4] E --> G[PCIe 4.0x4 SSD] E --> H[vPro企业功能] ``` > **扩展差异**: > - i3支持更快的存储(PCIe 4.0 SSD读取>5000MB/s vs N5105的2000MB/s) > - N5105更适合固定功能设备(如NAS/工控机),无需高速扩展 --- ### **选购决策指南** ```mermaid graph TD A[需求类型?] A --> B{高性能场景?} B --> |是| C[i3-1115G4] B --> |否| D{低功耗要求?} D --> |是| E[N5105] D --> |否| F{预算限制?} F --> |<¥3000| E F --> |>¥4000| C ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值