
主要还是用到了WindowManager对桌面悬浮进行管理.
需要一个火箭的悬浮窗 一个发射台悬浮窗 ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., 返回原位.
1.打开activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.windowmanagerdemo1.MainActivity" >
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_start"
android:text="start"
/>
</RelativeLayout>
就一个Button.
2.新建一个小悬浮窗的视图small_view.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="60dp"
android:layout_height="20dp"
android:id="@+id/ll_smallView"
android:background="#000000"
android:orientation="vertical"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/tv_percent"
android:textColor="#ffffff"
/>
</LinearLayout>
<ImageView
android:id="@+id/iv_recketImg"
android:layout_width="45dp"
android:layout_height="90dp"
android:src="@drawable/rocket"
android:visibility="gone"
/>
</FrameLayout>
在帧布局中放入一个LinearLayout,这个主要用来显示当前手机内存, 同时放入一个ImageView ,这个用于手指按下时显示出小火箭,平常小悬浮窗显示时则小火箭隐藏,当按住了小悬浮窗,则显示小火箭,隐藏悬浮窗.
3.新建 大悬浮窗视图 big_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="100dp"
android:id="@+id/ll_bigView"
android:background="#000000"
android:orientation="vertical" >
<Button
android:id="@+id/btn_close"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:text="关闭悬浮窗"
android:textColor="#ffffff"
/>
<Button
android:id="@+id/btn_back"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:text="返回"
android:textColor="#ffffff"
/>
</LinearLayout>
大悬浮窗 是在点击了小悬浮窗后显示的,里面就放了两个按钮.
4.新建发射台的视图 luncher.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_luncher"
android:layout_width="200dp"
android:layout_height="88dp"
android:src="@drawable/launcher_bg_hold"
/>
</LinearLayout>
发射台视图只有一个ImageView.
5,新建一个FloatBigView.java 大悬浮窗的实体类
public class FloatBigView extends LinearLayout {
//记录大悬浮窗的高度
public static int ViewHeight;
//记录大悬浮窗的宽度
public static int ViewWidth;
public FloatBigView(final Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.big_view, this);
View view=findViewById(R.id.ll_bigView);
ViewHeight=view.getLayoutParams().height;
ViewWidth=view.getLayoutParams().width;
Button btn_close=(Button) findViewById(R.id.btn_close);
Button btn_back=(Button) findViewById(R.id.btn_back);
btn_close.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyWindowManager.removeBigView(context);
MyWindowManager.removeSmallWindow(context);
Intent intent=new Intent(getContext(), WindowService.class);
context.stopService(intent);
}
});
btn_back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyWindowManager.removeBigView(context);
MyWindowManager.createSmallWindow(context);
}
});
}
}
大悬浮窗的实体类 里面就是绑定刚才的大悬浮窗视图,并找到两个按钮,监听一个 关闭 和一个 返回的事件, MyWindowManager将在下面创建
6,小悬浮窗的实体类
public class FloatSmallView extends LinearLayout {
public static int ViewHeight;
public static int ViewWidth;
//系统状态栏的高度
private static int statusHeight;
private WindowManager mWindowManager;
//小悬浮窗布局
private LinearLayout smallViewLayout;
//小火箭
private ImageView rocketImg;
//小悬浮窗参数
private WindowManager.LayoutParams mLayoutParams;
//记录手指在屏幕按下时的横坐标
private float xDown;
//记录手指在屏幕按下时的纵坐标
private float yDown;
//记录手指在屏幕移动时的横坐标
private float xMove;
//记录手指在屏幕移动时的纵坐标
private float yMove;
//记录手指按下时在小悬浮窗的横坐标
private float xInView;
//记录手指按下时在小悬浮窗的纵坐标
private float yInView;
//记录小火箭的高度
private int rocketHeight;
//记录小火箭的宽度
private int rocketWidth;
//记录当前手指是否在悬浮窗按下
private boolean isPressed;
public FloatSmallView(Context context) {
super(context);
mWindowManager=(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
LayoutInflater.from(context).inflate(R.layout.small_view,this);
smallViewLayout=(LinearLayout) findViewById(R.id.ll_smallView);
ViewHeight=smallViewLayout.getLayoutParams().height;
ViewWidth=smallViewLayout.getLayoutParams().width;
rocketImg=(ImageView) findViewById(R.id.iv_recketImg);
rocketHeight=rocketImg.getLayoutParams().height;
rocketWidth=rocketImg.getLayoutParams().width;
TextView tv_percent=(TextView) findViewById(R.id.tv_percent);
tv_percent.setText(MyWindowManager.getUsedPercentValue(context));
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isPressed = true;
// 手指按下时记录必要数据,纵坐标的值都需要减去状态栏高度
xInView = event.getX();
yInView = event.getY();
xDown = event.getRawX();
yDown= event.getRawY() - getStatusBarHeight();
xMove = event.getRawX();
yMove = event.getRawY() - getStatusBarHeight();
break;
case MotionEvent.ACTION_MOVE:
xMove=event.getRawX();
yMove=event.getRawY()-getStatusBarHeight();
updateViewStatus();
updateViewPosition();
break;
case MotionEvent.ACTION_UP:
isPressed=false;
if(MyWindowManager.isReadyToLuncher()){
luncherRocket();
}
else{
updateViewStatus();
if(xDown==xMove&&yDown==yMove){
Log.e("info","进入1");
openBigWindow();
}
}
break;
}
return true;
}
//打开大悬浮窗口,关闭小悬浮窗
private void openBigWindow(){
Log.e("info","进入2");
MyWindowManager.createBigView(getContext());
MyWindowManager.removeSmallWindow(getContext());
}
//开始发射小火箭
private void luncherRocket(){
MyWindowManager.removeRocketLuncher(getContext());
new LuncherTask().execute();
}
//传入小悬浮窗的参数, 用于更新位置
public void setParams(WindowManager.LayoutParams mParams){
this.mLayoutParams=mParams;
}
//更新小悬浮窗的位置
private void updateViewPosition(){
mLayoutParams.x=(int) (xMove-xInView);
mLayoutParams.y=(int) (yMove-yInView);
mWindowManager.updateViewLayout(this, mLayoutParams);
//检查小火箭是否到了发射台
MyWindowManager.updateLuncher();
}
//更新悬浮窗的显示样式 ,如果是按下状态 则显示为小火箭 否则为普通悬浮窗
private void updateViewStatus(){
if(isPressed&&rocketImg.getVisibility()!=View.VISIBLE){
mLayoutParams.width=rocketWidth;
mLayoutParams.height=rocketHeight;
mWindowManager.updateViewLayout(this, mLayoutParams);
smallViewLayout.setVisibility(View.GONE);
rocketImg.setVisibility(View.VISIBLE);
MyWindowManager.createLuncher(getContext());
}
else if(!isPressed){
mLayoutParams.width=ViewWidth;
mLayoutParams.height=ViewHeight;
mWindowManager.updateViewLayout(this, mLayoutParams);
smallViewLayout.setVisibility(View.VISIBLE);
rocketImg.setVisibility(View.GONE);
MyWindowManager.removeRocketLuncher(getContext());
}
}
//开始执行发射小火箭的任务
class LuncherTask extends AsyncTask<Void,Void, Void>{
@Override
protected Void doInBackground(Void... arg0) {
while(mLayoutParams.y>0){
mLayoutParams.y=mLayoutParams.y-20;
publishProgress();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
mWindowManager.updateViewLayout(FloatSmallView.this, mLayoutParams);
}
@Override
protected void onPostExecute(Void result) {
//小火箭升空后 回归悬浮窗状态
updateViewStatus();
mLayoutParams.x=(int) (xDown-xInView);
mLayoutParams.y=(int) (yDown-yInView);
mWindowManager.updateViewLayout(FloatSmallView.this, mLayoutParams);
}
}
//获取状态栏的高度
private int getStatusBarHeight() {
if (statusHeight == 0) {
try {
Class<?> c = Class.forName("com.android.internal.R$dimen");
Object o = c.newInstance();
Field field = c.getField("status_bar_height");
int x = (Integer) field.get(o);
statusHeight = getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
}
return statusHeight;
}
}
小悬浮窗中方法较多,注释较多
7.创建发射台实体类RocketLuncher.java
//火箭发射台
public class RocketLuncher extends LinearLayout {
public static int width;
public static int height;
private ImageView luncherImg;
public RocketLuncher(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.luncher, this);
luncherImg=(ImageView) findViewById(R.id.iv_luncher);
width=luncherImg.getLayoutParams().width;
height=luncherImg.getLayoutParams().height;
}
//更新火箭发射台的显示状态
public void updateLuncherState(boolean isReadyToLuncher){
if(isReadyToLuncher){
luncherImg.setImageResource(R.drawable.launcher_bg_fire);
}
else{
luncherImg.setImageResource(R.drawable.launcher_bg_hold);
}
}
}
8,新建一个MyWindowManager.java用来管理这几个悬浮窗
public class MyWindowManager {
//小悬浮窗的实例
private static FloatSmallView mSmallView;
//大悬浮窗的实例
private static FloatBigView mBigView;
//火箭发射台的实例
private static RocketLuncher rocketLuncher;
//小悬浮窗的参数
private static LayoutParams mSmallViewParams;
//大悬浮窗的参数
private static LayoutParams mBigViewParams;
//火箭发射台的参数
private static LayoutParams rocketLuncherParams;
//用于在屏幕上添加或移除窗口
private static WindowManager mWindowManager;
//获取手机可用内存
private static ActivityManager mActivityManager;
//创建小悬浮窗
public static void createSmallWindow(Context context){
WindowManager windowManager=getWindowManager(context);
int screenWidth=windowManager.getDefaultDisplay().getWidth();
int screenHeight=windowManager.getDefaultDisplay().getHeight();
if(mSmallView==null){
mSmallView=new FloatSmallView(context);
if(mSmallViewParams==null){
mSmallViewParams=new LayoutParams();
mSmallViewParams.type=LayoutParams.TYPE_SYSTEM_ALERT;
mSmallViewParams.format=PixelFormat.RGBA_8888;
mSmallViewParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
mSmallViewParams.gravity=Gravity.LEFT|Gravity.TOP;
mSmallViewParams.width=FloatSmallView.ViewWidth;
mSmallViewParams.height=FloatSmallView.ViewHeight;
mSmallViewParams.x=screenWidth;
mSmallViewParams.y=screenHeight/2;
}
mSmallView.setParams(mSmallViewParams);
windowManager.addView(mSmallView, mSmallViewParams);
}
}
//将小悬浮窗从屏幕上移除
public static void removeSmallWindow(Context context){
if(mSmallView!=null){
WindowManager windowManager=getWindowManager(context);
windowManager.removeView(mSmallView);
mSmallView=null;
}
}
//创建大悬浮窗
public static void createBigView(Context context){
WindowManager windowManager=getWindowManager(context);
int screenWidth=windowManager.getDefaultDisplay().getWidth();
int screenHeight=windowManager.getDefaultDisplay().getHeight();
if(mBigView==null){
mBigView=new FloatBigView(context);
if(mBigViewParams==null){
mBigViewParams=new LayoutParams();
mBigViewParams.x=screenWidth/2-FloatBigView.ViewWidth/2;
mBigViewParams.y=screenHeight/2-FloatBigView.ViewHeight/2;
mBigViewParams.type=LayoutParams.TYPE_PHONE;
mBigViewParams.format= PixelFormat.RGBA_8888;
mBigViewParams.gravity=Gravity.LEFT|Gravity.TOP;
mBigViewParams.width=FloatBigView.ViewWidth;
mBigViewParams.height=FloatBigView.ViewHeight;
}
windowManager.addView(mBigView, mBigViewParams);
}
}
//将大悬浮窗移除
public static void removeBigView(Context context){
if(mBigView!=null){
WindowManager windowManager=getWindowManager(context);
windowManager.removeView(mBigView);
mBigView=null;
}
}
//创建一个火箭发射台
public static void createLuncher(Context context){
WindowManager windowManager=getWindowManager(context);
int screenWidht=windowManager.getDefaultDisplay().getWidth();
int screenHeight=windowManager.getDefaultDisplay().getHeight();
if(rocketLuncher==null){
rocketLuncher=new RocketLuncher(context);
if(rocketLuncherParams==null){
rocketLuncherParams=new LayoutParams();
rocketLuncherParams.x=screenWidht/2-RocketLuncher.width/2;
rocketLuncherParams.y=screenHeight-RocketLuncher.height;
rocketLuncherParams.type=LayoutParams.TYPE_PHONE;
rocketLuncherParams.format=PixelFormat.RGBA_8888;
rocketLuncherParams.gravity=Gravity.LEFT|Gravity.TOP;
rocketLuncherParams.width=RocketLuncher.width;
rocketLuncherParams.height=RocketLuncher.height;
}
windowManager.addView(rocketLuncher, rocketLuncherParams);
}
}
//移除火箭发射台
public static void removeRocketLuncher(Context context){
if(rocketLuncher!=null){
WindowManager wm=getWindowManager(context);
wm.removeView(rocketLuncher);
rocketLuncher=null;
}
}
//更新火箭发射台的显示状态
public static void updateLuncher(){
if(rocketLuncher!=null){
rocketLuncher.updateLuncherState(isReadyToLuncher());
}
}
//更新小悬浮窗TextView的内存占比
public static void updateUserPercent(Context context){
if(mSmallView!=null){
TextView percent=(TextView) mSmallView.findViewById(R.id.tv_percent);
percent.setText(getUsedPercentValue(context));
}
}
//是否有悬浮窗
public static boolean isWindowShow(){
return mSmallView!=null||mBigView!=null;
}
/**
* 计算已使用内存的百分比,并返回。
*
* @param context
* 可传入应用程序上下文。
* @return 已使用内存的百分比,以字符串形式返回。
*/
public static String getUsedPercentValue(Context context) {
String dir = "/proc/meminfo";
try {
FileReader fr = new FileReader(dir);
BufferedReader br = new BufferedReader(fr, 2048);
String memoryLine = br.readLine();
String subMemoryLine = memoryLine.substring(memoryLine
.indexOf("MemTotal:"));
br.close();
long totalMemorySize = Integer.parseInt(subMemoryLine.replaceAll(
"\\D+", ""));
long availableSize = getAvailableMemory(context) / 1024;
int percent = (int) ((totalMemorySize - availableSize)
/ (float) totalMemorySize * 100);
return percent + "%";
} catch (IOException e) {
e.printStackTrace();
}
return "悬浮窗";
}
/**
* 获取当前可用内存,返回数据以字节为单位。
*
* @param context
* 可传入应用程序上下文。
* @return 当前可用内存。
*/
private static long getAvailableMemory(Context context) {
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
getActivityManager(context).getMemoryInfo(mi);
return mi.availMem;
}
//判断小火箭是否准备好发射
public static boolean isReadyToLuncher(){
if ((mSmallViewParams.x > rocketLuncherParams.x && mSmallViewParams.x
+ mSmallViewParams.width < rocketLuncherParams.x
+ rocketLuncherParams.width)
&& (mSmallViewParams.y + mSmallViewParams.height > rocketLuncherParams.y)) {
return true;
}
return false;
}
//得到WindowManager的单例
private static WindowManager getWindowManager(Context context){
if(mWindowManager==null){
mWindowManager=(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
}
return mWindowManager;
}
//得到ActivityManager的单例
private static ActivityManager getActivityManager(Context context){
if(mActivityManager==null){
mActivityManager=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
}
return mActivityManager;
}
}
9.悬浮窗的服务WindowService.java,用来时刻检查当前视图是否该显示悬浮窗还是隐藏.
public class WindowService extends Service {
//在线程中创建或移除悬浮窗
private Handler handler=new Handler();
//定时器 检查当前是应该创建还是移除悬浮窗
private Timer mTimer;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(mTimer==null){
mTimer=new Timer();
mTimer.scheduleAtFixedRate(new RefreshTaks(), 0, 500);
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
mTimer.cancel();
mTimer=null;
}
class RefreshTaks extends TimerTask{
@Override
public void run() {
//如果当前是桌面且没有窗口显示,则创建小悬浮窗
if(isHome()&&!MyWindowManager.isWindowShow()){
handler.post(new Runnable() {
@Override
public void run() {
MyWindowManager.createSmallWindow(getApplicationContext());
}
});
}
//如果不是桌面,且有悬浮窗显示,则移除悬浮窗
else if(!isHome()&&MyWindowManager.isWindowShow()){
handler.post(new Runnable() {
@Override
public void run() {
MyWindowManager.removeBigView(getApplicationContext());
MyWindowManager.removeSmallWindow(getApplicationContext());
}
});
}
//当前是桌面 且有悬浮窗显示 则更新内存
else if(isHome()&&MyWindowManager.isWindowShow()){
handler.post(new Runnable() {
@Override
public void run() {
MyWindowManager.updateUserPercent(getApplicationContext());
}
});
}
}
}
/**
* 判断当前界面是否是桌面
*/
private boolean isHome() {
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);
return getHomes().contains(rti.get(0).topActivity.getPackageName());
}
/**
* 获得属于桌面的应用的应用包名称
*
* @return 返回包含所有包名的字符串列表
*/
private List<String> getHomes() {
List<String> names = new ArrayList<String>();
PackageManager packageManager = this.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo ri : resolveInfo) {
names.add(ri.activityInfo.packageName);
}
return names;
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
10.打开MainActivity.java
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_start=(Button) findViewById(R.id.btn_start);
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this, WindowService.class);
MainActivity.this.startService(intent);
MainActivity.this.finish();
}
});
}
}
开启服务.
- 自制window下core animation引擎 - demo第二弹 - 仿QQ电脑管家加速小火箭
一年前想写一个像cocoa那样,可以方便层动画开发的引擎,写着写着又逆向它的QuartzCore.framework,也就是CoreAnimation的底层,已经大半年没有搞windows这个引擎.大 ...
- Android仿腾讯手机管家实现桌面悬浮窗小火箭发射的动画效果
功能分析: 1.小火箭游离在activity之外,不依附于任何activity,不管activity是否开启,不影响小火箭的代码逻辑,所以小火箭的代码逻辑是要写在服务中: 2.小火箭挂载在手机窗体之上 ...
- Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...
- Android 桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 先谈一下基本的实现原理,这种桌面悬浮窗的效果很 ...
- Android -- 桌面悬浮,仿360
实现原理 这种桌面悬浮窗的效果很类似与Wid ...
- android桌面悬浮窗实现
首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. ...
- Android自定义View实现仿QQ实现运动步数效果
效果图: 1.attrs.xml中 <declare-styleable name="QQStepView"> <attr name="outerCol ...
- Android -- 桌面悬浮,QQ管家火箭实现
续上一篇博客<Android -- 桌面悬浮,仿360>,传送门:http://www.cnblogs.com/yydcdut/p/3909888.html,在此代码上继续添加实现. 比起 ...
- 简易的可拖动的桌面悬浮窗效果Demo
首先,我们需要知道,悬浮窗分为两种:Activity级别的悬浮窗,系统级别的悬浮窗 Activity级别的悬浮窗跟随所属Activity的生命周期而变化,而系统级别的悬浮窗则可以脱离Activity而 ...
随机推荐
- Oracle 11g RAC小结
1.查看数据库所有实例与状态 unixdev$[/home/grid]srvctl status database -d unixdev Instance unixdev11 is running o ...
- oracle-03 表的管理
一.表名和列名的命名规则1).必须以字母开头2).长度不能超过30个字符3).不能使用oracle的保留字4).只能使用如下字符 a-z,a-z,0-9,$,#等 二.数据类型1).字符类char 长 ...
- Python基础—16-网络编程
网络编程 相关概念 OSI七层模型:开放系统互连参考模型.它从低到高分别是:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. TCP/IP:在OSI七层模型的基础上简化抽象出来的一套网络协 ...
- DB2表空间重定向恢复数据库实战
DB2的备份恢复有点坑,当源系统和目标系统的路径设置不同时,要手动进行重定向恢复,本文是我一次实战操作之后总结的过程,仅供参考. 一.发出重定向恢复命令 DB2 RESTORE DB TO " ...
- Flask模拟实现CSRF攻击
CSRF CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造. CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求. 包括:以你名义发送邮件,发消息,盗取你的账号 ...
- Python学习笔记:第2天while循环 运算符 格式化输出 编码
目录 1. while循环 continue.break和else语句 2. 格式化输出 3. 运算符 3.1 算数运算 3.2 比较运算符 3.3 赋值运算符 3.4 逻辑运算符 3.5 成员运算符 ...
- 常用数字信号的产生(C实现)-ARMA模型数据生成
ARMA模型属于信号现代谱估计的范畴,AR模型常用于信号的线性预测.AR模型最后归结为线性方程,MA最后为非线性方程,因此,AR模型使用较多. AR模型最后归结为解Yule-Walker方程,对应矩阵 ...
- CUBLAS基础实验
一.概述 最近在试图进行cuda并行编程,目标是编写一段矩阵计算代码,将计算结果存储进入GPU的缓冲区当中,并在达到某些要求后强制刷新缓冲区,取得计算结果. 但是考虑时间紧任务重的状况和实际的性能要求 ...
- 博科brocade光纤交换机alias-zone的划分-->实操案例
一,图形化操作 光纤交换机作为SAN网络的重要组成部分,在日常应用中非常普遍,本次将以常用的博科交换机介绍基本的配置方法. 博科300实物图: 环境描述: 如上图,四台服务器通过各自的双HBA卡连接至 ...
- Nginx一直报504超时,配置相关参数好了
相关参数:large_client_header_buffers 4 16k;client_max_body_size 30m;client_body_buffer_size 128k;proxy_c ...