版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Android中View移動(dòng)總結(jié):ViewDragHelper學(xué)習(xí)及用法詳解如上圖簡(jiǎn)單呈現(xiàn)出兩個(gè)方塊后,提出一個(gè)需求:
1.拖動(dòng)方塊時(shí),方塊(即子View)可以跟隨手指移動(dòng)。
2.一個(gè)方塊移動(dòng)時(shí),另一個(gè)方塊可以跟隨移動(dòng)。
3.將方塊移動(dòng)到左邊區(qū)域(右邊區(qū)域)后放開(kāi)(即手指離開(kāi)屏幕),它會(huì)自動(dòng)移動(dòng)到左邊界(右邊界)。
4.移動(dòng)的時(shí)候給方塊加點(diǎn)動(dòng)畫(huà)(duang~duang~duang~)。View移動(dòng)的相關(guān)方法總結(jié):1.layout在自定義控件中,View繪制的一個(gè)重寫(xiě)方法layout(),用來(lái)設(shè)置顯示的位置。所以,可以通過(guò)修改View的坐標(biāo)值來(lái)改變view在父View的位置,以此可以達(dá)到移動(dòng)的效果!但是缺點(diǎn)是只能移動(dòng)指定的View://通過(guò)layout方法來(lái)改變位置view.layout(l,t,r,b);2.offsetLeftAndRight()和offsetTopAndBottom()非常方便的封裝方法,只需提供水平、垂直方向上的偏移量,展示效果與layout()方法相同。view.offsetLeftAndRight(offset);//同時(shí)改變left和rightview.offsetTopAndBottom(offset);//同時(shí)改變top和bottom3.LayoutParams此類保存了一個(gè)View的布局參數(shù),可通過(guò)LayoutParams動(dòng)態(tài)改變一個(gè)布局的位置參數(shù),以此動(dòng)態(tài)地修改布局,達(dá)到View位置移動(dòng)的效果!但是在獲取getLayoutParams()時(shí),要根據(jù)該子View對(duì)應(yīng)的父View布局來(lái)決定自身的LayoutParams
。所以一切的前提是:必須要有一個(gè)父View,否則無(wú)法獲取LayoutParams
!//必須獲取父View的LayoutParamsLinearLayout.LayoutParamslayoutParams=(LinearLayout.LayoutParams)getLayoutParams();layoutParams.leftMargin=getLeft()+dx;layoutParams.topMargin=getTop()+dy;setLayoutParams(layoutParams);4.scrollTo和scrollBy通過(guò)改變scrollX和scrollY來(lái)移動(dòng),但是可以移動(dòng)所有的子View。scrollTo(x,y)表示移動(dòng)到一個(gè)具體的坐標(biāo)點(diǎn)(x,y),而scrollBy(x,y)表示移動(dòng)的增量為dx,dy。scrollTo(x,y);scrollBy(xOffset,yOffset);注意:這里使用scrollBy(xOffset,yOffset);,你會(huì)發(fā)現(xiàn)并沒(méi)有效果,因?yàn)橐陨蟽蓚€(gè)方法移動(dòng)的是View的content。若在ViewGroup中使用,移動(dòng)的是所有子View;若在View中使用,移動(dòng)的是View的內(nèi)容(比如TextView)。所以,不可在view中使用以上方法!應(yīng)該在View所在的ViewGroup中使用:((View)getParent()).scrollBy(offsetX,offsetY);【視圖坐標(biāo)系】:
可是即使這樣,你會(huì)發(fā)現(xiàn)view移動(dòng)的效果與設(shè)想方向相反!這是\o"Android知識(shí)庫(kù)"Android試圖移動(dòng)原因,若參數(shù)為正值,content將向坐標(biāo)軸負(fù)方向移動(dòng);參數(shù)為負(fù)值,content將向坐標(biāo)軸正方向移動(dòng)。所以要實(shí)現(xiàn)隨手指移動(dòng)而滑動(dòng)的效果,應(yīng)將偏移量設(shè)置為負(fù)值即可:((View)getParent()).scrollBy(-offsetX,-offsetY);5.canvas通過(guò)改變Canvas繪制的位置來(lái)移動(dòng)View的內(nèi)容,用的少:canvas.drawBitmap(bitmap,left,top,paint)總結(jié)但是要完成最開(kāi)始的提的需求,不管使用哪一種方法,都需要通過(guò)onTouchEvent方法來(lái)捕捉手勢(shì),自己手動(dòng)計(jì)算移動(dòng)距離,再改變子View的布局,不免有些麻煩,所以在這里引出正文,介紹一個(gè)強(qiáng)大的類來(lái)處理移動(dòng):ViewDragHelperViewDragHelper介紹:1.產(chǎn)生:
ViewDragHelper在高版本的v4包(android4.4以上的v4)中,于Google在2013年開(kāi)發(fā)者大會(huì)提出的2.作用:它主要用于處理ViewGroup中對(duì)子View的拖拽處理。3.使用:它主要封裝了對(duì)View的觸摸位置,觸摸速度,移動(dòng)距離等的檢測(cè)和Scroller,通過(guò)接口回調(diào)的方式通知我們。所以我們需要做的只是用接收來(lái)的數(shù)據(jù)指定這些子View是否需要移動(dòng),移動(dòng)多少等。4.本質(zhì):是一個(gè)對(duì)觸摸事件的解析類。ViewDragHelper實(shí)現(xiàn)1.ViewDragHelper實(shí)例創(chuàng)建/***FactorymethodtocreateanewViewDragHelper.**@paramforParentParentviewtomonitor*@paramsensitivityMultiplierforhowsensitivethehelpershouldbeaboutdetecting*thestartofadrag.Largervaluesaremoresensitive.1.0fisnormal.*@paramcbCallbacktoprovideinformationandreceiveevents*@returnanewViewDragHelperinstance*/viewDragHelper=ViewDragHelper.create(forParent,sensitivity,cb);create()就是創(chuàng)建ViewDragHelper實(shí)例的方法,代碼中的注釋是create()中參數(shù)的解釋,來(lái)查看:
(1)forParent:“用來(lái)監(jiān)視的父View”。傳入?yún)?shù)父View,即可監(jiān)視該父View中的所有子View。
(2)sensitivity:“檢測(cè)時(shí)的敏感度;值越大越敏感,1是正常范圍”。比如說(shuō)手指在滑動(dòng)屏幕時(shí)速度特別快,敏感度越大時(shí),此時(shí)速度快也可以檢測(cè)到,反之亦然。
(3)Callback:“提供信息和接受的事件”。最重要的參數(shù)!可以從這個(gè)回調(diào)提供的信息獲取到View滑動(dòng)的距離、速度等。2.自定義View繼承FrameLayout這里來(lái)個(gè)小提示:之前實(shí)現(xiàn)的布局中自定義DragLayout是繼承于ViewGroup,并且實(shí)現(xiàn)重寫(xiě)了onMeasure()方法,如下:DragLayout.javapublicclassDragLayoutextendsViewGroup{...@OverrideprotectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){super.onMeasure(widthMeasureSpec,heightMeasureSpec);//方法一:對(duì)子View的測(cè)量需求/*獲取子View的寬度100dp的兩種方法:intsize=(int)getResources().getDimension(R.dimen.width);intsize=readView.getLayoutParams().width;*/intmeasureSpec=MeasureSpec.makeMeasureSpec(redView.getLayoutParams().width,MeasureSpec.EXACTLY);//具體指定寬高,為精確模式redView.measure(measureSpec,measureSpec);//當(dāng)父控件測(cè)量完子控件,才可以填(0,0)blueView.measure(measureSpec,measureSpec);/*//方法二:如果說(shuō)沒(méi)有特殊的對(duì)子View的測(cè)量需求,可用如下方法measureChild(redView,widthMeasureSpec,heightMeasureSpec);measureChild(blueView,widthMeasureSpec,heightMeasureSpec);*/}}但是現(xiàn)在使DragLayout
類繼承于FrameLayout即可!publicclassDragLayoutextendsFrameLayout{...}因?yàn)樵谧远xViewGroup的時(shí)候,如果對(duì)子View的測(cè)量沒(méi)有特殊的需求,那么可以繼承系統(tǒng)已有的布局(比如FrameLayout、RelativeLayout),目的是為了讓已有的布局幫我們實(shí)現(xiàn)onMeasure()。所以在繼承之后,我們無(wú)需實(shí)現(xiàn)onMeasure()方法,以上代碼全部不需要(這里選擇繼承FrameLayout幀布局,原因是在Android源碼中其實(shí)現(xiàn)最簡(jiǎn)單),所以重寫(xiě)繼承的onLayout()方法其實(shí)是重寫(xiě)幀布局中的onLayout(),如果也注釋的話,你會(huì)發(fā)現(xiàn)藍(lán)色小方塊覆蓋紅色,一起擺放在左上角(其實(shí)就是幀布局的擺放規(guī)則)3.callback回調(diào)創(chuàng)建privateViewDragHelper.Callbackcallback=newCallback(){//必須要實(shí)現(xiàn)的方法@OverridepublicbooleantryCaptureView(Viewchild,intpointerId){returnfalse;}};4.觸摸、攔截事件以上部分ViewDragHelper的創(chuàng)建部分已完成,可是還沒(méi)結(jié)束。比如大家熟悉的一個(gè)類:GestureDetector手勢(shì)識(shí)別器,想要它生效,必須傳一個(gè)觸摸事件,這樣GestureDetector類才可以解析當(dāng)前手勢(shì)。道理相同,之前在介紹ViewDragHelper已提到,它只是一個(gè)對(duì)觸摸事件的解析類,需要傳一個(gè)觸摸事件,才會(huì)生效。//處理是否攔截@OverridepublicbooleanonInterceptTouchEvent(MotionEventev){//由viewDragHelper來(lái)判斷是否應(yīng)該攔截此事件booleanresult=viewDragHelper.shouldInterceptTouchEvent(ev);returnresult;}@OverridepublicbooleanonTouchEvent(MotionEventevent){//將觸摸事件傳給viewDragHelper來(lái)解析處理viewDragHcessTouchEvent(event);//消費(fèi)掉此事件,自己來(lái)處理returntrue;}以上則viewDragHelper可以監(jiān)視并解析我們的手勢(shì)了,而且會(huì)把信息通過(guò)回調(diào)傳遞給callback。5.處理computeScroll()該方法是Scroller類的核心,系統(tǒng)在繪制View的時(shí)候在draw()中調(diào)用此方法,實(shí)際與scrollTo()相同。@OverridepublicvoidcomputeScroll(){puteScroll();if(puteScrollOffset()){scrollTo(scroller.getCurrX(),scroller.getCurrY());invalidate();}如上,Scroller類提供computeScrollOffset()方法來(lái)判斷是否完成了整個(gè)滑動(dòng),同時(shí)getCurrX()和getCurrY()來(lái)獲得當(dāng)前滑動(dòng)坐標(biāo)。重點(diǎn)是invalidate()方法,因?yàn)橹荒茉赾omputeScroll()方法中獲取模擬過(guò)程中的scrollX
和
scrollY,但computeScroll()方法是不會(huì)自動(dòng)調(diào)用的,只能通過(guò)invalidate()—>draw()—>computeScroll()來(lái)間接調(diào)用computeScroll()方法!模擬過(guò)程結(jié)束,if判斷中computeScrollOffset()方法返回false,中斷循環(huán),完成整個(gè)平滑移動(dòng)過(guò)程!但是!??!我們并不采取以上方法,之前介紹過(guò)ViewDragHelper已經(jīng)封裝好了Scroller,用另外一種:@OverridepublicvoidcomputeScroll(){puteScroll();if(viewDragHelper.continueSettling(true)){ViewCompat.postInvalidateOnAnimation(DragLayout.this);}}}continueSettling()方法判斷是否結(jié)束,同Scroller的方法相似,主要是postInvalidateOnAnimation(),此方法不像Scroller的scrollTo,還需要傳值,其實(shí)此方法體內(nèi)已經(jīng)封裝好移動(dòng)的方法,它會(huì)自動(dòng)去測(cè)量當(dāng)前位置進(jìn)行移動(dòng),所以我們只需調(diào)用即可?。ㄔ谑种柑饡r(shí)回調(diào)的方法中也會(huì)用到它,后面介紹)6.實(shí)現(xiàn)callback回調(diào)中的方法之前在創(chuàng)建callback時(shí),默認(rèn)只實(shí)現(xiàn)了tryCaptureView()方法,完成需求僅僅不夠,還需要其它方法,依次介紹:(1)tryCaptureView()此方法用于判斷是否捕獲當(dāng)前child的觸摸事件,可以指定ViewDragHelper移動(dòng)哪一個(gè)子View。此例中,需要移動(dòng)兩個(gè)方塊,則判斷當(dāng)前View是否是自己想移動(dòng)的,返回boolean值。/**用于判斷是否捕獲當(dāng)前child的觸摸事件*@paramchild當(dāng)前觸摸的子View*@returntrue:捕獲并解析false:不處理*/@OverridepublicbooleantryCaptureView(Viewchild,intpointerId){returnchild==blueView||child==redView;}(2)onViewCaptured()此方法在View被開(kāi)始捕獲和解析時(shí)回調(diào),即當(dāng)tryCaptureView()中的返回值為true的時(shí)候,此方法才會(huì)被調(diào)用。例如tryCaptureView()方法中只捕獲紅色方塊,當(dāng)移動(dòng)紅方快時(shí),該方法會(huì)回調(diào),移動(dòng)藍(lán)色方塊時(shí)則不會(huì)!/**當(dāng)View被開(kāi)始捕獲和解析的回調(diào)(用處不大)*@paramcapturedChild當(dāng)前被捕獲的子View*/@OverridepublicvoidonViewCaptured(ViewcapturedChild,intactivePointerId){super.onViewCaptured(capturedChild,activePointerId);Log.e("tag","onViewCaptures");}(3)clampViewPositionHorizontal()和clampViewPositionVertical()這兩個(gè)為具體滑動(dòng)方法,分別對(duì)應(yīng)水平和垂直方向上的移動(dòng)。要想子View移動(dòng),此方法必須重寫(xiě)實(shí)現(xiàn)!而方法的返回值則是指定View在水平(left)或垂直(top)方向上變成的值,參數(shù)中的dx、dy則是代表相較于上一次位置的增量。/**控制child在水平方向的移動(dòng)*@paramchild*@paramleftViewDragHelper會(huì)將當(dāng)前child的left值改變成返回的值*@paramdx相較于上一次child在水平方向上移動(dòng)的*@return*/@OverridepublicintclampViewPositionHorizontal(Viewchild,intleft,intdx){returnleft;}/**控制child在垂直方向的移動(dòng)*@paramchild*@paramtopViewDragHelper會(huì)將當(dāng)前child的top值改變成返回的值*@paramdy相較于上一次child在水平方向上移動(dòng)的*@return*/@OverridepublicintclampViewPositionVertical(Viewchild,inttop,intdy){returntop;}};顯示效果:
通過(guò)以上GIF動(dòng)圖和日志打印可以看出,僅將返回值設(shè)置成方法中的參數(shù),方塊就可以任意移動(dòng)了。也證實(shí)了方法中提供的參數(shù)而dx或dy是每一次移動(dòng)的距離,left或top是指定View移動(dòng)到的位置,這是計(jì)算好了的,相當(dāng)于left=child.getLeft()+dx。
若想要它不移動(dòng),則:
returnleft-dx;
將它計(jì)算好后的距離減去相較于上次移動(dòng)的距離即可,此時(shí)的View就不會(huì)移動(dòng)。所以根據(jù)你的需求,可以任意改變此方法的返回值來(lái)移動(dòng)View。(4)getViewHorizontalDragRange()和getViewVerticalDragRange()看到以上GIF動(dòng)圖,你會(huì)發(fā)現(xiàn)我在移動(dòng)方塊時(shí),它可以超過(guò)邊界,沒(méi)有任何限制!有些不合理,想限制它的移動(dòng)范圍,這兩個(gè)方法就可以獲取View的拖拽范圍,將它的返回值設(shè)為:父控件的寬/高-子控件的寬/高,即控件可以移動(dòng)的范圍。//獲取View水平方向的拖拽范圍@OverridepublicintgetViewHorizontalDragRange(Viewchild){returngetMeasuredWidth()-child.getMeasuredWidth();}//獲取View垂直方向的拖拽范圍@OverridepublicintgetViewVerticalDragRange(Viewchild){returngetMeasuredHeight()-child.getMeasuredHeight();}可是以上實(shí)現(xiàn)后,你會(huì)發(fā)現(xiàn)拖拽方塊還是可以超出邊界,此方法并沒(méi)有起作用!是否代表此方法完全無(wú)用?這返回的值有何用?不是,它目前確實(shí)并不可以限制邊界,但此方法返回的值會(huì)用在:比如說(shuō)手指抬起時(shí),View緩慢移動(dòng)的動(dòng)畫(huà)時(shí)間的計(jì)算會(huì)用到此值,最好不要返回0(返回也不會(huì)錯(cuò))!但是我們還想要達(dá)到限制View拖拽邊界的效果,這時(shí)在第三點(diǎn)介紹的clampViewPositionHorizontal()和clampViewPositionVertical()發(fā)揮效果了,該方法是通過(guò)返回值來(lái)改變View移動(dòng)的位置,這時(shí)可以在方法中加判斷是否有越界:@OverridepublicintclampViewPositionHorizontal(Viewchild,intleft,intdx){if(left<0){//限制左邊界left=0;}elseif(left>(getMeasuredWidth()-child.getMeasuredWidth())){//限制右邊界left=getMeasuredWidth()-child.getMeasuredWidth();}returnleft;}顯示效果:
(5)onViewPositionChanged()目前為止,需求已經(jīng)完成可以任意拖拽View了,接下來(lái)完成拖拽View時(shí),另一塊跟隨移動(dòng)。這時(shí)介紹一個(gè)新的方法:onViewPositionChanged(),該方法在child(需要捕捉的View)位置改變時(shí)執(zhí)行,參數(shù)left(top)跟之前介紹方法中含義相同,為child最新的left(top)位置,而dx(dy)是child相較于上一次移動(dòng)時(shí)水平(垂直)方向上改變的距離。了解之后,就知道這個(gè)方法很強(qiáng)大了,在方法體中判斷具體View,再根據(jù)方法提供的參數(shù)設(shè)置另一View的位置,如下:/**當(dāng)child位置改變時(shí)執(zhí)行*@paramchangedView位置改變的子View*@paramleftchild最新的left位置*@paramtopchild最新的top位置*@paramdx相較于上一次水平移動(dòng)的距離*@paramdy相較于上一次垂直移動(dòng)的距離*/@OverridepublicvoidonViewPositionChanged(ViewchangedView,intleft,inttop,intdx,intdy){super.onViewPositionChanged(changedView,left,top,dx,dy);if(changedView==blueView){//拖動(dòng)藍(lán)色方塊時(shí),紅色也跟隨移動(dòng)redView.layout(redView.getLeft()+dx,redView.getTop()+dy,redView.getRight()+dx,redView.getBottom()+dy);}elseif(changedView==redView){//拖動(dòng)紅色方塊時(shí),藍(lán)色也跟隨移動(dòng)blueView.layout(blueView.getLeft()+dx,blueView.getTop()+dy,blueView.getRight()+dx,blueView.getBottom()+dy);}}顯示效果:
(6)onViewReleased()完成目前需求第三個(gè):手指在左邊(右邊)區(qū)域離開(kāi)屏幕后,方塊自動(dòng)移動(dòng)到左邊界(右邊界)。接下來(lái)介紹最后一個(gè)方法onViewReleased(),手指抬起的時(shí)候執(zhí)行該方法。這里有兩個(gè)新參數(shù):
xvel:
x方向移動(dòng)的速度,若是正值,則代表向右移動(dòng),若是負(fù)值則向左移動(dòng);
yvel:
y方向移動(dòng)的速度,若是正值則向下移動(dòng),若是負(fù)值則向上移動(dòng)。/**手指抬起的時(shí)候執(zhí)行該方法*@paramreleasedChild當(dāng)前抬起的View*@paramxvelx方向移動(dòng)的速度:正值:向右移動(dòng)負(fù)值:向左移動(dòng)*@paramyvely方向移動(dòng)的速度:正值:向下移動(dòng)負(fù)值:向上移動(dòng)*/@OverridepublicvoidonViewReleased(ViewreleasedChild,floatxvel,floatyvel){super.onViewReleased(releasedChild,xvel,yvel);intcenterLeft=getMeasuredWidth()/2-releasedChild.getMeasuredWidth()/2;if(releasedChild.getLeft()<centerLeft){//在左半邊,應(yīng)該向左緩慢移動(dòng),不用scroller,ViewDragHelper已封裝好viewDragHelper.smoothSlideViewTo(releasedChild,0,releasedChild.getTop());//仍需要刷新!ViewCompat.postInvalidateOnAnimation(DragLayout.this);//scroller.startScroll();//invalidate();}else{//在右半邊,向右緩慢移動(dòng)viewDragHelper.smoothSlideViewTo(releasedChild,getMeasuredWidth()-releasedChild.getMeasuredWidth(),releasedChild.getTop());ViewCompat.postInvalidat
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)產(chǎn)業(yè)科技創(chuàng)新與成果轉(zhuǎn)化路徑考核試卷
- 家具品牌社會(huì)責(zé)任與公益事業(yè)實(shí)踐考核試卷
- 2024年度金融產(chǎn)品銷售團(tuán)隊(duì)激勵(lì)合同范本3篇
- 初一數(shù)學(xué)試題2012新版有理數(shù)的乘除法一百道題含答案
- 《支持向量數(shù)據(jù)描述在工業(yè)過(guò)程故障檢測(cè)中的應(yīng)用研究》
- 表內(nèi)乘除法練習(xí)100題
- 物聯(lián)網(wǎng)產(chǎn)業(yè)升級(jí)-洞察分析
- 新型光電子材料在通信中的應(yīng)用-洞察分析
- 醫(yī)療支付改革研究-洞察分析
- 2024年員工分紅與員工權(quán)益保障及激勵(lì)計(jì)劃協(xié)議3篇
- 四川省綿陽(yáng)市2024年七年級(jí)上學(xué)期數(shù)學(xué)期末考試試卷【附答案】
- 建筑工程施工合同:游泳館建設(shè)
- DB31-T 1305-2021 未成年人家庭監(jiān)護(hù)能力評(píng)估指南
- 南京工程學(xué)院《C語(yǔ)言程序設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中建中建機(jī)械頂管專項(xiàng)方案范本
- 機(jī)動(dòng)車(chē)檢測(cè)站程序文件(根據(jù)補(bǔ)充要求修訂)
- 精神科患者首次風(fēng)險(xiǎn)評(píng)估單
- 防沖撞升降柱安裝合同
- 2024年下半年安徽文都控股集團(tuán)限公司公開(kāi)招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 二零二四年碼頭岸線使用權(quán)轉(zhuǎn)讓合同
- 離婚協(xié)議自愿離婚協(xié)議模板2024年
評(píng)論
0/150
提交評(píng)論