




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Activity和Window的View的移動(dòng)的一些思考與體會(huì),騰訊懸浮小火箭的實(shí)現(xiàn)策略事實(shí)上寫這個(gè)也是因?yàn)樽约簩?shí)際在項(xiàng)目中用到了才會(huì)去研究已經(jīng)寫文章,對(duì)于View的移動(dòng),其實(shí)說(shuō)實(shí)話,已經(jīng)有很多文章了,既然如此的話,那我實(shí)在是不好意思再去重復(fù)的講解,但是和Window的View還是有一些區(qū)別的,接下來(lái),我會(huì)實(shí)際的講解一下這些區(qū)別已經(jīng)坐標(biāo)函數(shù)的計(jì)算方法,當(dāng)然,最后再講一下如何實(shí)現(xiàn)騰訊的懸浮小火箭,這些都是比較好的干貨,我也相信大家都是比較喜歡的,而你在本文中將學(xué)會(huì)使用View的移動(dòng)計(jì)算坐標(biāo),有三個(gè)目錄1.Activity中View的移動(dòng)2.Window中View的移動(dòng)3.實(shí)現(xiàn)騰訊懸浮小火箭我們首
2、先新建一個(gè)項(xiàng)目ViewAndWindow來(lái)實(shí)現(xiàn)三個(gè)按鈕作為這三個(gè)功能的三個(gè)Activity跳轉(zhuǎn),三個(gè)Activity分別是ActivityActivityWindowActivityTencentActivity所以主布局-activity_layout.xml應(yīng)該是這么寫的<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout
3、_height="match_parent" android:gravity="center" android:orientation="vertical" android:padding="10dp"> <Button android:id="+id/btnActivity" android:layout_width="match_parent" android:layout_height="wrap_content" android:tex
4、t="Activity中View的移動(dòng)" android:textAllCaps="false" /> <Button android:id="+id/btnWindow" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Window中View的移動(dòng)" android:textAllCaps="false" />
5、<Button android:id="+id/btnTencent" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="騰訊小火箭" android:textAllCaps="false" /></LinearLayout>不可否認(rèn),我們的MainActivty只是作為程序的入口,所以他的代碼是十分的簡(jiǎn)單的package com.lgl.viewa
6、ndwindow;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity implements View.OnClickListener private Button btnActivity, btnWindow, btnTencent;
7、 Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); /初始化View private void initView() btnActivity = (Button) findViewById(R.id.btnActivity); btnActivity.setOnClickListener(this); btnWindow = (Button) find
8、ViewById(R.id.btnWindow); btnWindow.setOnClickListener(this); btnTencent = (Button) findViewById(R.id.btnTencent); btnTencent.setOnClickListener(this); /點(diǎn)擊事件 Override public void onClick(View v) switch (v.getId() case R.id.btnActivity: startActivity(new Intent(this, ActivityActivity.class); break; c
9、ase R.id.btnWindow: startActivity(new Intent(this, WindowActivity.class); break; case R.id.btnTencent: startActivity(new Intent(this, TencentActivity.class); break; 而我們的重點(diǎn)也不在這里,而在這些子Activity一.Activity中View的移動(dòng)實(shí)際上,View在Activity上移動(dòng),還是要依靠事件去傳遞,總所周知,View的繪制流程一般都是先onMeasure測(cè)量,接下來(lái)是onLayout確定位置,最后才是onDraw繪制
10、,所以,我們的更新坐標(biāo)其實(shí)是在onLayout進(jìn)行的,好吧,說(shuō)這些再多都不如代碼來(lái)的實(shí)際一點(diǎn),我們?cè)贏ctivity中寫一個(gè)ImageView <ImageView android:id="+id/ivDraw" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="mipmap/ic_launcher" />我們就是要對(duì)他下手了,是的,就在OnTouchListener中進(jìn)行,OnTo
11、uchListener回調(diào)中有一個(gè)MotionEvent類,他封裝了我們觸摸事件的大部分動(dòng)作,其中就包括三大將軍 switch (event.getAction() /按下 case MotionEvent.ACTION_DOWN: break; /抬起 case MotionEvent.ACTION_UP: break; /移動(dòng) case MotionEvent.ACTION_MOVE: break;而我們?nèi)绻麊螁沃皇且苿?dòng)這個(gè)View的話,其實(shí)是用不到抬起這個(gè)UP的動(dòng)作的,我們要想實(shí)現(xiàn)這個(gè)View的移動(dòng),首先得知道這個(gè)View在哪里,所以我們需要先定義兩個(gè)變量 /起點(diǎn)坐標(biāo) private i
12、nt startX, startY;而我們什么時(shí)候得到View的初始坐標(biāo)呢?肯定是在按下這個(gè)動(dòng)作上獲取 startX = (int) event.getRawX(); startY = (int) event.getRawY();而這里,肯定就會(huì)有人問,這個(gè)getX和getRowX有什么區(qū)別,其實(shí)區(qū)別還是挺大的,前者是獲取當(dāng)前父容器的X坐標(biāo),后者是相對(duì)于整個(gè)屏幕的坐標(biāo),OK,獲取到之后,我們應(yīng)該干什么?這個(gè)時(shí)候我們應(yīng)該使用到MOVE這個(gè)動(dòng)作了,你在拖動(dòng),我計(jì)算偏移量并且更新這個(gè)View的位置,來(lái)達(dá)到移動(dòng)的視覺效果,那我們還得定義幾個(gè)變量首先是你的重點(diǎn)坐標(biāo),有始有終/終點(diǎn)坐標(biāo) private i
13、nt endX, endY;緊接著,會(huì)讓終點(diǎn)坐標(biāo)減去起點(diǎn)坐標(biāo),來(lái)計(jì)算這個(gè)偏移量,所以有了偏移量的變量/偏移量 private int dx, dy;所以,我們MOVE的動(dòng)作里計(jì)算公式應(yīng)該是這樣的 endX = (int) event.getRawX(); endY = (int) event.getRawY(); /計(jì)算移動(dòng)偏移量 dx = endX - startX; dy = endY - startY;獲取到你移動(dòng)的偏移量,我們就可以拿到移動(dòng)后的坐標(biāo)了,還記得我們?cè)诶L制矩形的時(shí)候用到的那套公式嗎我們直接套用這套公式,其實(shí)就可以得到左上右下的坐標(biāo)了int left = tvAddress.
14、getLeft() + dx;int top = tvAddress.getTop() + dy;int right = tvAddress.getRight() + dx;int bottom = tvAddress.getBottom() + dy;OK,這里,其實(shí)有點(diǎn)類似于測(cè)量,測(cè)量結(jié)束之后就可以確定位置了,就得用到我們的onLayout了 /重新部署位置 ivDraw.layout(left, top, right, bottom);到這里,其實(shí)很多人就以為走完了的,其實(shí)更新完位置之后,你還要把初始位置給初始化一下,也就是賦值成你更新后的坐標(biāo)點(diǎn)/重新初始化坐標(biāo)startX = (int
15、) event.getRawX();startY = (int) event.getRawY();對(duì)了。記得return true,這里你會(huì)問,為什么是true,因?yàn)閠rue代表我要消耗掉這個(gè)事件,你其他的就不要接收了,你不信的話可以設(shè)置一個(gè)點(diǎn)擊事件看看有沒有效果!這里,我們就算大功告成了,如果你想記錄這個(gè)坐標(biāo)點(diǎn),你就會(huì)用到UP了,不多說(shuō),我們運(yùn)行看看效果但是這里,還需要優(yōu)化一下,比如,我移動(dòng)到邊上的時(shí)候直接就進(jìn)去了,我們應(yīng)該放置這個(gè)View超過屏幕,對(duì)吧,那我們應(yīng)該怎么做?我們首先先獲取到整個(gè)屏幕的寬高 wm = (WindowManager) getSystemService(WINDOW
16、_SERVICE); width = wm.getDefaultDisplay().getWidth(); height = wm.getDefaultDisplay().getHeight();這樣,我們通過WindowManager就能直接拿到寬高了,然后我們?cè)谝苿?dòng)的時(shí)候可以這樣做/防止上下 if (top < 0 | bottom > height - 20) return true; /防止左右 if (left < 0 | right > width) return true; 這樣,我們就可以直接看到效果了這里的減去20是狀態(tài)欄的,但是下面的虛擬按鍵倒是沒有
17、考慮進(jìn)去,不過思路真的可行好了,上面是步驟,我們就直接把代碼全部貼出來(lái)吧package com.lgl.viewandwindow;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.widget.ImageView;/* * Created by LGL on 2016/7/28. */pu
18、blic class ActivityActivity extends AppCompatActivity private ImageView ivDraw; /起點(diǎn)坐標(biāo) private int startX, startY; /終點(diǎn)坐標(biāo) private int endX, endY; /偏移量 private int dx, dy; /窗口管理器 private WindowManager wm; /屏幕寬高 private int width, height; Override protected void onCreate(Bundle savedInstanceState) super
19、.onCreate(savedInstanceState); setContentView(R.layout.activity_activity); wm = (WindowManager) getSystemService(WINDOW_SERVICE); width = wm.getDefaultDisplay().getWidth(); height = wm.getDefaultDisplay().getHeight(); ivDraw = (ImageView) findViewById(R.id.ivDraw); ivDraw.setOnTouchListener(new View
20、.OnTouchListener() Override public boolean onTouch(View v, MotionEvent event) switch (event.getAction() case MotionEvent.ACTION_DOWN: startX = (int) event.getRawX(); startY = (int) event.getRawY(); break; case MotionEvent.ACTION_UP: break; case MotionEvent.ACTION_MOVE: endX = (int) event.getRawX();
21、endY = (int) event.getRawY(); /計(jì)算移動(dòng)偏移量 dx = endX - startX; dy = endY - startY; /* *根據(jù)偏移量更新位置(重新部署位置) */ int left = ivDraw.getLeft() + dx; int top = ivDraw.getTop() + dy; int right = ivDraw.getRight() + dx; int bottom = ivDraw.getBottom() + dy; /防止上下 if (top < 0 | bottom > height - 20) return t
22、rue; /防止左右 if (left < 0 | right > width) return true; /重新部署位置 ivDraw.layout(left, top, right, bottom); /重新初始化坐標(biāo) startX = (int) event.getRawX(); startY = (int) event.getRawY(); break; return true; ); 二.Window中View的移動(dòng)Activity上畢竟是有跡可循,那Window上呢?其實(shí)窗體上邏輯是差不多的,唯一差的,就是那些函數(shù)的調(diào)用了,OK,我們進(jìn)入WindowActivity中,
23、先寫個(gè)Button啟動(dòng)這個(gè)Window <Button android:id="+id/showWindow" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Show Window" android:textAllCaps="false" />他所對(duì)應(yīng)的點(diǎn)擊事件 /點(diǎn)擊事件 showWindow = (Button) findViewById(R.id.sh
24、owWindow); showWindow.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) showMoveWindow(); );而我們這個(gè)小節(jié)的重點(diǎn)就的照顧一下 showMoveWindow()這個(gè)方法了,怎么實(shí)現(xiàn)一個(gè)Window不是今天的重點(diǎn),而且也確實(shí)沒什么可講的,我就直接上代碼了 /窗口管理器 wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); /
25、布局參數(shù) final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT; layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | /WindowManager.Layo
26、utParams.FLAG_NOT_TOUCHABLE | 不能觸摸 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; /格式 layoutParams.format = PixelFormat.TRANSLUCENT; /類型 layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; ivDraw = new ImageView(this); ivDraw.setBackgroundResource(R.mipmap.ic_launcher); /加載view wm.addView(iv
27、Draw, layoutParams);這段代碼就能實(shí)現(xiàn)一個(gè)window了,我們可以看一下我們需要權(quán)限哦<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />11我們是直接new了一個(gè)ImageView的,但是不妨礙我們使用View的移動(dòng),我們直接實(shí)現(xiàn)它的觸摸事件 /觸摸事件 ivDraw.setOnTouchListener(new View.OnTouchListener() Override public boolean onTouch(View v, Motion
28、Event event) switch (event.getAction() case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: break; return true; );我這里暫時(shí)也只是實(shí)現(xiàn)了兩個(gè)動(dòng)作,因?yàn)樽鳛檠菔疚覀兊腢P確實(shí)用不上,我們有了前車之鑒,我們直接定義我們需要的變量吧 /起始坐標(biāo) private int startX, startY; /終點(diǎn)坐標(biāo) private int endX, endY; /偏移量 private int dx, dy;OK,老套路,在DOWN中,我們只是獲取當(dāng)前的坐標(biāo) s
29、tartX = (int) event.getRawX(); startY = (int) event.getRawY();但是移動(dòng)的時(shí)候,獲取的就不是左上右下了,而是他的x和y坐標(biāo),因?yàn)樗莣indow,所以我們用到的是LayoutParams,更新位置也是使用的LayoutParams,他有一個(gè)updateViewLayout的方法 endX = (int) event.getRawX(); endY = (int) event.getRawY(); /計(jì)算移動(dòng)偏移量 dx = endX - startX; dy = endY - startY; /* *根據(jù)偏移量更新位置(重新部署位置)
30、 */ layoutParams.x += dx; layoutParams.y += dy; /更新位置 wm.updateViewLayout(ivDraw, layoutParams); /重新初始化坐標(biāo) startX = (int) event.getRawX(); startY = (int) event.getRawY();當(dāng)然,最后return true;我們?cè)囋嚩驗(yàn)樗莣indow的改哪里,他并不需要去做一些超出邊距的處理,很nice把這部分代碼也全部貼上來(lái)package com.lgl.viewandwindow;import android.content.Context
31、;import android.graphics.PixelFormat;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.widget.Button;import android.widget.ImageView;/* * Created by LGL on 2016/7/28. */pu
32、blic class WindowActivity extends AppCompatActivity private Button showWindow; /窗口管理器 private WindowManager wm; /圖片 private ImageView ivDraw; /起始坐標(biāo) private int startX, startY; /終點(diǎn)坐標(biāo) private int endX, endY; /偏移量 private int dx, dy; Override protected void onCreate(Bundle savedInstanceState) super.onC
33、reate(savedIstanceState); setContentView(R.layout.activity_window); /點(diǎn)擊事件 showWindow = (Button) findViewById(R.id.showWindow); showWindow.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) showMoveWindow(); ); /顯示窗口 private void showMoveWindow() /窗口管理器 wm = (WindowMan
34、ager)getSystemService(Context.WINDOW_SERVICE); /布局參數(shù) final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT; layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; layoutParams.flags = WindowManager.Layou
35、tParams.FLAG_NOT_FOCUSABLE | /WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | 不能觸摸 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; /格式 layoutParams.format = PixelFormat.TRANSLUCENT; /類型 layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; ivDraw = new ImageView(this); ivDraw.setBackgroundResou
36、rce(R.mipmap.ic_launcher); /觸摸事件 ivDraw.setOnTouchListener(new View.OnTouchListener() Override public boolean onTouch(View v, MotionEvent event) switch (event.getAction() case MotionEvent.ACTION_DOWN: startX = (int) event.getRawX(); startY = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE
37、: endX = (int) event.getRawX(); endY = (int) event.getRawY(); /計(jì)算移動(dòng)偏移量 dx = endX - startX; dy = endY - startY; /* *根據(jù)偏移量更新位置(重新部署位置) */ layoutParams.x += dx; layoutParams.y += dy; /更新位置 wm.updateViewLayout(ivDraw, layoutParams); /重新初始化坐標(biāo) startX = (int) event.getRawX(); startY = (int) event.getRawY()
38、; break; return true; ); /加載view wm.addView(ivDraw, layoutParams); 三.實(shí)現(xiàn)騰訊懸浮小火箭到這里,其實(shí)已經(jīng)算是知道點(diǎn)邏輯了,我們就是用window去做的一個(gè)操作,既然如此,那我們就直接基于上面的代碼去去實(shí)現(xiàn)這個(gè)小火箭吧,還是原來(lái)的代碼,只是把圖片更換成了一個(gè)小火箭,然后為了使它是是一個(gè)動(dòng)態(tài)的效果,我們可以給他設(shè)置一個(gè)切換的動(dòng)畫<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="
39、 > <item android:drawable="drawable/desktop_rocket_launch_in" android:duration="200"/> <item android:drawable="drawable/desktop_rocket_launch_out" android:duration="200"/></animation-list>這個(gè)其實(shí)就是兩張圖片的切換效果,我們直接去開啟他 mView = View.inflate(getAp
40、plicationContext(), R.layout.rocket_window, null); ivRocket = (ImageView) mView.findViewById(R.id.ivRocket); AnimationDrawable anim = (AnimationDrawable) ivRocket.getBackground(); t();OK,現(xiàn)在我們?nèi)ビ?jì)算他的起飛了,而且還要考慮到他背景,我們其實(shí)可以大膽的使用一個(gè)Activity去做,我們?cè)赨P這個(gè)動(dòng)作結(jié)束的時(shí)候就去計(jì)算坐標(biāo),當(dāng)滿足某一個(gè)坐標(biāo)范圍的時(shí)候就去啟動(dòng)動(dòng)畫和啟動(dòng)背景動(dòng)畫,那我們應(yīng)該這樣計(jì)算 case Mo
41、tionEvent.ACTION_UP: Log.i(TAG,"抬起"); Log.i(TAG,"抬起坐標(biāo):" + startX + ":" + startY); Log.i(TAG,"條件 : 200 < x >" + (width - 100) + "并且 y > " + (height - 200); /設(shè)置大致的發(fā)射范圍 if (layoutParams.x > 50 && layoutParams.x < 250 && la
42、youtParams.y > 350) /發(fā)射火箭 sendRocket(); new Handler().postDelayed(new Runnable() Override public void run() /啟動(dòng)動(dòng)畫 Intent i = new Intent(getApplicationContext(), BackgroundActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); ,1000); break;這里其實(shí)偷了個(gè)懶,沒有去做屏幕的嚴(yán)格適配,有興趣的伙伴可以參考一下可
43、以看到我們有一個(gè) sendRocket();方法就是啟動(dòng)小火箭,啟動(dòng)背景就是啟動(dòng)這個(gè)BackgroundActivity,我們先看小火箭 /* * 發(fā)射火箭的方法 */ private void sendRocket() new Thread(new Runnable() Override public void run() /動(dòng)畫 y坐標(biāo)一直減少,實(shí)現(xiàn)上升動(dòng)畫 for (int i = 0; i <= height / 50; i+) /每循環(huán)一次減去乘以5 int y = height - i * 100; Log.i(TAG,"y = " + y); Messa
44、ge msg = new Message(); msg.arg1 = y; handler.sendMessage(msg); /暫停一下 try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace(); ).start(); 因?yàn)橐泄?jié)奏感,所以開了個(gè)handler來(lái)延遲一下,但是子線程不能更新主UI的,所以我們需要發(fā)一個(gè)handler來(lái)更新坐標(biāo)private Handler handler = new Handler() Override public void handleMessage(Message
45、msg) super.handleMessage(msg); layoutParams.y = msg.arg1; /更新窗口 wm.updateViewLayout(mView, layoutParams); ;最后就是這個(gè)Activity了,里面真的啥也沒有package com.lgl.viewandwindow;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.animation.AlphaAnimation;import android.widget.ImageView;/* * 煙霧動(dòng)畫 * Created by LGL on 2016/7/30. */public class BackgroundActivity extends Activity private ImageView smoke_m, smoke_t; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activ
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新解讀《HG-T 3089-2001燃油用O形橡膠密封圈材料》新解讀
- 級(jí)配碎石底基層施工方案
- 專題梳理 動(dòng)詞不規(guī)則變化自測(cè)表 課件
- 低能負(fù)離子在錐形玻璃管中的傳輸行為研究
- 合作股份公司管理制度
- 物理中考一輪復(fù)習(xí)教案 第二十九講 電功、電功率
- 倉(cāng)儲(chǔ)店線下活動(dòng)策劃方案
- 倉(cāng)庫(kù)拍賣活動(dòng)方案
- 倉(cāng)鼠食品活動(dòng)方案
- 代理記賬推廣活動(dòng)方案
- 【MOOC】政府審計(jì)學(xué)-南京審計(jì)大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 《基督教概論》課件
- 虛擬現(xiàn)實(shí)技術(shù)導(dǎo)論 習(xí)題答案或解題思路 梁曉輝
- 計(jì)算機(jī)應(yīng)用技術(shù)專業(yè)調(diào)研報(bào)告(高職)
- 2024NEA水性氣硅涂膏隔熱保溫墻體構(gòu)造
- 山西省太原市(2024年-2025年小學(xué)四年級(jí)語(yǔ)文)部編版期末考試((上下)學(xué)期)試卷及答案
- BPC10完整版本.0技術(shù)培訓(xùn)V1.0
- 2024年新高考II卷高考?xì)v史試卷(真題+答案)
- 2024年黑龍江醫(yī)療衛(wèi)生事業(yè)單位招聘(藥學(xué))備考試題庫(kù)(含答案)
- 2024年新高考1卷數(shù)學(xué)真題試卷及答案
- 湖北省武漢市洪山區(qū)2023-2024學(xué)年七年級(jí)下學(xué)期期末考試語(yǔ)文試卷
評(píng)論
0/150
提交評(píng)論