Android电子白板 视频会议电子白板
2013-08-22 10:18
190 查看
Android电子白板 实现了功能。服务器传送和转发没放:废话不说直接贴代码了
MainActitvty.java(主类)
DrawView.java(画图类)
DashPoint.java(数据类)
Point.java(数据类)
PointData.java(数据类)
MainActitvty.java(主类)
package com.ubi.whitebord; import comm.ubi.util.DashPoint; import comm.ubi.util.Point; import comm.ubi.util.PointData; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.Spinner; public class MainActivity extends Activity { private LinearLayout linearLayout; private DrawView m_view; private int m_type=1; private Boolean selectStatus=false; private int resetDrawType; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Spinner s1 = (Spinner)findViewById(R.id.spinner01); s1.setPrompt("选择权限"); String[] mItems = getResources().getStringArray(R.array.spinnermodel); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_gallery_item,mItems); //样式 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); s1.setAdapter(adapter); s1.setSelection(1, true); linearLayout = (LinearLayout)findViewById(R.id.main_tab_container); linearLayout.setOnTouchListener(new touchListener()); //画笔 RadioButton button3 = (RadioButton)findViewById(R.id.radio_button3); button3.setOnClickListener(new button3ClickListener()); //直线 RadioButton button4 = (RadioButton)findViewById(R.id.radio_button4); button4.setOnClickListener(new button4ClickListener()); //空心矩形 RadioButton button5 = (RadioButton)findViewById(R.id.radio_button5); button5.setOnClickListener(new button5ClickListener()); //实心矩形 RadioButton button6=(RadioButton)findViewById(R.id.radio_button6); button6.setOnClickListener(new button6ClickListener()); //空心圆 RadioButton button7=(RadioButton)findViewById(R.id.radio_button7); button7.setOnClickListener(new button7ClickListener()); //实心圆 RadioButton button8=(RadioButton)findViewById(R.id.radio_button8); button8.setOnClickListener(new button8ClickListener()); //选中用虚线的矩形 RadioButton button1 = (RadioButton)findViewById(R.id.radio_button1); button1.setOnClickListener(new button1Clicklistener()); //选中删除功能 RadioButton button2 = (RadioButton)findViewById(R.id.radio_button2); button2.setOnClickListener(new button2ClickListenner()); //清空 Button clear_button_top = (Button)findViewById(R.id.clear_button_top); clear_button_top.setOnClickListener(new clearButtonListenner()); init(); } private class button2ClickListenner implements OnClickListener{ @Override public void onClick(View v) { m_view.setDashListClear(); m_type=8; } } private class clearButtonListenner implements OnClickListener{ @Override public void onClick(View v) { m_view.setClearArrayList(); m_view.setDashListClear(); m_view.invalidate(); } } private class button1Clicklistener implements OnClickListener{ @Override public void onClick(View v) { m_view.setDashListClear(); m_type=7; } } /*private class button9ClickListener implements OnClickListener{ @Override public void onClick(View v) { m_type=7; } }*/ private class button8ClickListener implements OnClickListener{ @Override public void onClick(View v) { m_view.setDashListClear(); m_type=6; } } private class button7ClickListener implements OnClickListener{ @Override public void onClick(View v) { m_view.setDashListClear(); m_type=5; } } private class button6ClickListener implements OnClickListener{ @Override public void onClick(View v) { m_view.setDashListClear(); m_type=4; } } private class button5ClickListener implements OnClickListener{ @Override public void onClick(View v) { m_view.setDashListClear(); m_type=3; } } private class button4ClickListener implements OnClickListener{ @Override public void onClick(View v) { m_view.setDashListClear(); m_type=1; } } private class button3ClickListener implements OnClickListener{ @Override public void onClick(View v) { m_view.setDashListClear(); m_type=2; } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } private void init(){ m_view=new DrawView(this); linearLayout.addView(m_view); } private class touchListener implements OnTouchListener { PointData obj; Point pointvalue; @Override public boolean onTouch(View v, MotionEvent event) { float x = event.getX(); float y = event.getY(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: m_view.moveObj.Init(); obj=new PointData(); obj.leftx=x; obj.lefty=y; //当选中的图形做标记 if(!m_view.dashList.isEmpty()) { for(int i1=0; i1<m_view.dashList.size(); i1++) { DashPoint objSelect = m_view.dashList.get(i1); if((int)x>=(int)objSelect.left && (int)x<=(int)objSelect.right && (int)y>=(int)objSelect.top && (int)y<=(int)objSelect.bottom) { selectStatus=true; } if((int)x<=(int)objSelect.left && (int)x>=(int)objSelect.right && (int)y<=(int)objSelect.top && (int)y>=(int)objSelect.bottom) { selectStatus=true; } } } if(!selectStatus) { m_view.moveObj.leftx=x; m_view.moveObj.lefty=y; } break; case MotionEvent.ACTION_UP: obj.rightx=x; obj.righty=y; obj.drawType=m_type; if(selectStatus)//选中 { resetDrawType = 9; obj.drawType=resetDrawType; selectStatus=false; } m_view.isUp=false;//临时的那个画图就没了 m_view.setPonintCollection(obj); m_view.invalidate(); break; case MotionEvent.ACTION_MOVE: pointvalue.x=x; pointvalue.y=y; obj.point.add(pointvalue); if(!selectStatus) { m_view.isUp=true; m_view.moveObj.rightx=x; m_view.moveObj.righty=y; m_view.moveObj.point.add(pointvalue); m_view.moveObj.drawType=m_type; } m_view.invalidate(); break; } pointvalue = new Point(); pointvalue.startx=x; pointvalue.starty=y; return true; } } }
DrawView.java(画图类)
package com.ubi.whitebord; import java.util.ArrayList; import java.util.Vector; import comm.ubi.util.DashPoint; import comm.ubi.util.Point; import comm.ubi.util.PointData; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PathEffect; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.view.View; class DrawView extends View { private ArrayList<PointData> list = new ArrayList<PointData>(); public PointData moveObj = new PointData(); public ArrayList<DashPoint> dashList = new ArrayList<DashPoint>(); public Boolean isUp=false; public DrawView(Context context) { super(context); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(isUp) { switch(moveObj.drawType) { case 1://画线 drawLine(canvas,moveObj); break; case 2://画笔 drawPen(canvas,moveObj); break; case 3: drawFillRect(canvas,moveObj); break; case 4://实心圆 drawFillRect(canvas,moveObj); break; case 5: drawOval(canvas,moveObj); break; case 6: drawOval(canvas,moveObj); break; case 7: drawDashRect(canvas,moveObj); break; case 8: drawDashRect(canvas,moveObj); } } //存在的类型绘制 for(int i=0; i<list.size(); i++) { PointData obj = list.get(i); switch(obj.drawType) { case 1://画线 drawLine(canvas,obj); break; case 2://画笔 drawPen(canvas,obj); break; case 3://空心矩形 drawFillRect(canvas,obj); break; case 4://实心矩形 drawFillRect(canvas,obj); break; case 5://空心圆 drawOval(canvas,obj); break; case 6://实心圆 drawOval(canvas,obj); break; case 7://虚线选中 selectDrawRectDashed(canvas,obj); break; case 8://删除 selectDelete(canvas,obj); break; case 9: //选中的点 down和up的点相减就是我们每个物品的移动的点 resetDrawInvalidate(canvas,obj); break; } } drawDashRectSelect(canvas,dashList); } protected void resetDrawInvalidate(Canvas canvas , PointData obj) { float x , y; x=obj.rightx-obj.leftx; y=obj.righty-obj.lefty; for(int i=0; i<dashList.size(); i++) { DashPoint dashObj = dashList.get(i); dashList.get(i).left = dashObj.left+(x); dashList.get(i).top= dashObj.top+(y); dashList.get(i).right = dashObj.right+(x); dashList.get(i).bottom = dashObj.bottom+(y); //加上了list里面的数据 list.get(dashObj.point_index).leftx=list.get(dashObj.point_index).leftx+(x); list.get(dashObj.point_index).lefty=list.get(dashObj.point_index).lefty+(y); list.get(dashObj.point_index).rightx=list.get(dashObj.point_index).rightx+(x); list.get(dashObj.point_index).righty=list.get(dashObj.point_index).righty+(y); //当是画笔的时候需要我们把移动过程的点数也加上 if (list.get(dashObj.point_index).drawType == 2) { for(int listi=0;listi<list.get(dashObj.point_index).point.size();listi++) { Point pointvalue = list.get(dashObj.point_index).point.get(listi); pointvalue.startx=pointvalue.startx+(x); pointvalue.starty=pointvalue.starty+(y); pointvalue.x=pointvalue.x+(x); pointvalue.y=pointvalue.y+(y); } } } list.remove(obj); invalidate(); } protected void drawDashRect(Canvas canvas , PointData obj) { Paint p = new Paint(); PathEffect effects = new DashPathEffect(new float[]{5,5,5,5},1); p.setPathEffect(effects); p.setColor(Color.GRAY);//设置颜色 p.setStyle(Paint.Style.STROKE);//设置填满 canvas.drawRect(obj.leftx, obj.lefty, obj.rightx, obj.righty, p); } protected void selectDelete(Canvas canvas , PointData obj) { Vector<PointData> myArray = new Vector<PointData>(); for(int i=0; i<list.size(); i++) { PointData objs = list.get(i); //虚线矩形必须进行判断 float left=obj.leftx,top=obj.lefty,right=obj.rightx,bottom=obj.righty; if(obj.rightx<obj.leftx) { left=obj.rightx; right=obj.leftx; } if(obj.righty<obj.lefty) { top=obj.righty; bottom=obj.lefty; } switch(objs.drawType) { case 1://画线 Region currentRegion = new Region(); currentRegion.set((int)left, (int)top, (int)right, (int)bottom); Region clip1 = new Region(); clip1.set(0, 0, 2000, 2000); //这条线的region Region compareRegion = new Region(); left=objs.leftx; top=objs.lefty; right=objs.rightx; bottom=objs.righty; if(objs.rightx<objs.leftx) { left=objs.rightx; right=objs.leftx; } if(objs.righty<objs.lefty) { top=objs.righty; bottom=objs.lefty; } Path m_path = new Path(); m_path.moveTo(left, top); m_path.lineTo(left+1, top); m_path.lineTo(right+1, bottom); m_path.lineTo(right, bottom); m_path.lineTo(left, top); compareRegion.setPath(m_path, clip1); if(currentRegion.op(compareRegion, Region.Op.INTERSECT)) { myArray.add(objs); } break; case 2://画笔 //当前的这个矩形的Region Region R1 = new Region(); R1.set((int)left, (int)top, (int)right, (int)bottom); //定义的一个空的Region Region region = new Region(); region.set(0, 0, 1, 1); //为了下面的Region Region clip = new Region(); clip.set(0, 0, 2000, 2000); int minleft=0; int mintop=0; int maxright=0; int maxbottom=0; for(int peni=0; peni<objs.point.size(); peni++) { Point pointvalue = objs.point.get(peni); float x = pointvalue.x; float y = pointvalue.y; float startx=pointvalue.startx; float starty=pointvalue.starty; if (0 == peni) { minleft = maxright = (int)objs.leftx; mintop = maxbottom = (int)objs.lefty; } if (minleft > (int)x) { minleft = (int)x; } if (mintop > (int)y) { mintop = (int)y; } if (maxright < (int)x) { maxright = (int)x; } if (maxbottom < (int)y) { maxbottom = (int)y; } Region newRegion = new Region(); left=startx; top=starty; right=x; bottom=y; if(x<startx) { left=x; right=startx; } if(y<starty) { top=y; bottom=starty; } Path rectRg = new Path(); rectRg.moveTo(left, top); rectRg.lineTo(left+1, top); rectRg.lineTo(right+1, bottom); rectRg.lineTo(right, bottom); rectRg.lineTo(left, top); newRegion.setPath(rectRg, clip); region.op(newRegion, Region.Op.UNION); } //dash的矩形和当前绘制的矩形的交集 if(R1.op(region, Region.Op.INTERSECT)) { myArray.add(objs); } break; case 3://空心矩形 Rect a = new Rect((int)left, (int)top, (int)right, (int)bottom); left=objs.leftx; top=objs.lefty; right=objs.rightx; bottom=objs.righty; if(objs.rightx<objs.leftx) { left=objs.rightx; right=objs.leftx; } if(objs.righty<objs.lefty) { top=objs.righty; bottom=objs.lefty; } Rect b = new Rect((int)left, (int)top, (int)right, (int)bottom); Boolean boolRect = Rect.intersects(a, b); if(boolRect) { myArray.add(objs); } break; case 4://实心矩形 Rect ax = new Rect((int)left, (int)top, (int)right, (int)bottom); left=objs.leftx; top=objs.lefty; right=objs.rightx; bottom=objs.righty; if(objs.rightx<objs.leftx) { left=objs.rightx; right=objs.leftx; } if(objs.righty<objs.lefty) { top=objs.righty; bottom=objs.lefty; } Rect bx = new Rect((int)left, (int)top, (int)right, (int)bottom); Boolean boolRectBoolean = Rect.intersects(ax, bx); if(boolRectBoolean) { myArray.add(objs); } break; case 5://空心圆 Region currentRegionF = new Region(); currentRegionF.set((int)left, (int)top, (int)right, (int)bottom); //这条线的region Region compareCircle = new Region(); left=objs.leftx; top=objs.lefty; right=objs.rightx; bottom=objs.righty; if(objs.rightx<objs.leftx) { left=objs.rightx; right=objs.leftx; } if(objs.righty<objs.lefty) { top=objs.righty; bottom=objs.lefty; } compareCircle.set((int)left,(int)top,(int)right,(int)bottom); if(currentRegionF.op(compareCircle, Region.Op.INTERSECT)) { myArray.add(objs); } break; case 6://实心圆 Region currentRegionFill = new Region(); currentRegionFill.set((int)left, (int)top, (int)right, (int)bottom); //这条线的region Region compareCircleFill = new Region(); left=objs.leftx; top=objs.lefty; right=objs.rightx; bottom=objs.righty; if(objs.rightx<objs.leftx) { left=objs.rightx; right=objs.leftx; } if(objs.righty<objs.lefty) { top=objs.righty; bottom=objs.lefty; } compareCircleFill.set((int)left,(int)top,(int)right,(int)bottom); if(currentRegionFill.op(compareCircleFill, Region.Op.INTERSECT)) { myArray.add(objs); } break; } } if(!myArray.isEmpty()) { for(int ai=0; ai<myArray.size(); ai++) { list.remove(myArray.get(ai)); } } list.remove(obj); invalidate(); } protected void selectDrawRectDashed(Canvas canvas , PointData obj) { dashList.clear(); for(int i=0; i<list.size(); i++) { DashPoint dashObj = new DashPoint(); PointData objs = list.get(i); //虚线矩形必须进行判断 float left=obj.leftx,top=obj.lefty,right=obj.rightx,bottom=obj.righty; if(obj.rightx<obj.leftx) { left=obj.rightx; right=obj.leftx; } if(obj.righty<obj.lefty) { top=obj.righty; bottom=obj.lefty; } switch(objs.drawType) { case 1://画线 Region currentRegion = new Region(); currentRegion.set((int)left, (int)top, (int)right, (int)bottom); Region clip1 = new Region(); clip1.set(0, 0, 2000, 2000); //这条线的region Region compareRegion = new Region(); left=objs.leftx; top=objs.lefty; right=objs.rightx; bottom=objs.righty; if(objs.rightx<objs.leftx) { left=objs.rightx; right=objs.leftx; } if(objs.righty<objs.lefty) { top=objs.righty; bottom=objs.lefty; } Path m_path = new Path(); m_path.moveTo(left, top); m_path.lineTo(left+1, top); m_path.lineTo(right+1, bottom); m_path.lineTo(right, bottom); m_path.lineTo(left, top); compareRegion.setPath(m_path, clip1); if(currentRegion.op(compareRegion, Region.Op.INTERSECT)) { dashObj.left = left-4; dashObj.top = top-4; dashObj.right = right+4; dashObj.bottom = bottom+4; dashObj.point_index = i; dashList.add(dashObj); } break; case 2://画笔 //当前的这个矩形的Region Region R1 = new Region(); R1.set((int)left, (int)top, (int)right, (int)bottom); //定义的一个空的Region Region region = new Region(); region.set(0, 0, 1, 1); //为了下面的Region Region clip = new Region(); clip.set(0, 0, 2000, 2000); int minleft=0; int mintop=0; int maxright=0; int maxbottom=0; for(int peni=0; peni<objs.point.size(); peni++) { Point pointvalue = objs.point.get(peni); float x = pointvalue.x; float y = pointvalue.y; float startx=pointvalue.startx; float starty=pointvalue.starty; if (0 == peni) { minleft = maxright = (int)objs.leftx; mintop = maxbottom = (int)objs.lefty; } if (minleft > (int)x) { minleft = (int)x; } if (mintop > (int)y) { mintop = (int)y; } if (maxright < (int)x) { maxright = (int)x; } if (maxbottom < (int)y) { maxbottom = (int)y; } Region newRegion = new Region(); left=startx; top=starty; right=x; bottom=y; if(x<startx) { left=x; right=startx; } if(y<starty) { top=y; bottom=starty; } Path rectRg = new Path(); rectRg.moveTo(left, top); rectRg.lineTo(left+1, top); rectRg.lineTo(right+1, bottom); rectRg.lineTo(right, bottom); rectRg.lineTo(left, top); newRegion.setPath(rectRg, clip); region.op(newRegion, Region.Op.UNION); } //dash的矩形和当前绘制的矩形的交集 if(R1.op(region, Region.Op.INTERSECT)) { dashObj.left = minleft-4; dashObj.top = mintop-4; dashObj.right = maxright+4; dashObj.bottom = maxbottom+4; dashObj.point_index = i; dashList.add(dashObj); } break; case 3://空心矩形 Rect a = new Rect((int)left, (int)top, (int)right, (int)bottom); left=objs.leftx; top=objs.lefty; right=objs.rightx; bottom=objs.righty; if(objs.rightx<objs.leftx) { left=objs.rightx; right=objs.leftx; } if(objs.righty<objs.lefty) { top=objs.righty; bottom=objs.lefty; } Rect b = new Rect((int)left, (int)top, (int)right, (int)bottom); Boolean boolRect = Rect.intersects(a, b); if(boolRect) { dashObj.left = left-4; dashObj.top = top-4; dashObj.right = right+4; dashObj.bottom = bottom+4; dashObj.point_index = i; dashList.add(dashObj); } break; case 4://实心矩形 Rect ax = new Rect((int)left, (int)top, (int)right, (int)bottom); left=objs.leftx; top=objs.lefty; right=objs.rightx; bottom=objs.righty; if(objs.rightx<objs.leftx) { left=objs.rightx; right=objs.leftx; } if(objs.righty<objs.lefty) { top=objs.righty; bottom=objs.lefty; } Rect bx = new Rect((int)left, (int)top, (int)right, (int)bottom); Boolean boolRectBoolean = Rect.intersects(ax, bx); if(boolRectBoolean) { dashObj.left = left-4; dashObj.top = top-4; dashObj.right = right+4; dashObj.bottom = bottom+4; dashObj.point_index = i; dashList.add(dashObj); } break; case 5://空心圆 Region currentRegionF = new Region(); currentRegionF.set((int)left, (int)top, (int)right, (int)bottom); //这条线的region Region compareCircle = new Region(); left=objs.leftx; top=objs.lefty; right=objs.rightx; bottom=objs.righty; if(objs.rightx<objs.leftx) { left=objs.rightx; right=objs.leftx; } if(objs.righty<objs.lefty) { top=objs.righty; bottom=objs.lefty; } compareCircle.set((int)left,(int)top,(int)right,(int)bottom); if(currentRegionF.op(compareCircle, Region.Op.INTERSECT)) { dashObj.left = left-4; dashObj.top = top-4; dashObj.right = right+4; dashObj.bottom = bottom+4; dashObj.point_index = i; dashList.add(dashObj); } break; case 6://实心圆 Region currentRegionFill = new Region(); currentRegionFill.set((int)left, (int)top, (int)right, (int)bottom); //这条线的region Region compareCircleFill = new Region(); left=objs.leftx; top=objs.lefty; right=objs.rightx; bottom=objs.righty; if(objs.rightx<objs.leftx) { left=objs.rightx; right=objs.leftx; } if(objs.righty<objs.lefty) { top=objs.righty; bottom=objs.lefty; } compareCircleFill.set((int)left,(int)top,(int)right,(int)bottom); if(currentRegionFill.op(compareCircleFill, Region.Op.INTERSECT)) { dashObj.left = left-4; dashObj.top = top-4; dashObj.right = right+4; dashObj.bottom = bottom+4; dashObj.point_index = i; dashList.add(dashObj); } break; } } if(!dashList.isEmpty()) { drawDashRectSelect(canvas,dashList); } list.remove(obj); } protected void drawDashRectSelect(Canvas canvas , ArrayList<DashPoint> dashList) { Paint p = new Paint(); PathEffect effects = new DashPathEffect(new float[]{5,5,5,5},1); p.setPathEffect(effects); p.setColor(Color.GRAY);//设置颜色 p.setStyle(Paint.Style.STROKE);//设置填满 for(int i=0; i<dashList.size(); i++) { DashPoint obj = dashList.get(i); canvas.drawRect(obj.left, obj.top, obj.right, obj.bottom, p); } } protected void drawPen(Canvas canvas , PointData obj) { Path mPath = new Path();//路径对象 Paint mPaint = new Paint(); mPaint.setColor(Color.BLACK);//设置颜色 mPaint.setAntiAlias(true);//画笔抗锯齿 mPaint.setStyle(Paint.Style.STROKE);//画笔的类型 mPaint.setStrokeCap(Paint.Cap.ROUND);//设置画笔圆滑状 mPaint.setStrokeWidth(2);//设置线的宽度 mPath.moveTo(obj.leftx, obj.lefty); for(int i=0; i<obj.point.size(); i++) { Point pointvalue = obj.point.get(i); float x = pointvalue.x; float y = pointvalue.y; float startx=pointvalue.startx; float starty=pointvalue.starty; mPath.quadTo(startx, starty , x, y); } canvas.drawPath(mPath, mPaint); } protected void drawLine(Canvas canvas , PointData obj){ Paint p = new Paint(); p.setColor(Color.BLACK); canvas.drawLine(obj.leftx, obj.lefty, obj.rightx, obj.righty, p); } protected void drawFillRect(Canvas canvas , PointData obj){ Paint p = new Paint(); if(obj.drawType==3){//空心圆 p.setColor(Color.GRAY);//设置颜色 p.setStyle(Paint.Style.STROKE);//设置填满 canvas.drawRect(obj.leftx, obj.lefty, obj.rightx, obj.righty, p); }else if(obj.drawType==4){//实心圆 p.setColor(Color.GRAY);//设置颜色 p.setStyle(Paint.Style.FILL);//设置填满 canvas.drawRect(obj.leftx, obj.lefty, obj.rightx, obj.righty, p); } } protected void drawOval(Canvas canvas , PointData obj){ Paint p = new Paint(); if(obj.drawType==5){//空心圆 p.setColor(Color.GRAY);//设置颜色 p.setStyle(Paint.Style.STROKE);//设置空心 canvas.drawOval(new RectF(obj.leftx, obj.lefty, obj.rightx, obj.righty), p); }else if(obj.drawType==6){//实心圆 p.setColor(Color.GRAY);//设置颜色 p.setStyle(Paint.Style.FILL);//设置填满 canvas.drawOval(new RectF(obj.leftx, obj.lefty, obj.rightx, obj.righty), p); } } protected void setPonintCollection(PointData o){ list.add(o); } protected void setClearArrayList(){ list.clear(); moveObj.Init(); invalidate(); } protected void setDashListClear() { dashList.clear(); invalidate(); } }
DashPoint.java(数据类)
package comm.ubi.util; public class DashPoint { public float left,top,right,bottom; public int point_index; public DashPoint() { } }
Point.java(数据类)
package comm.ubi.util; public class Point{ public float x,y,startx,starty; public Point(float x, float y,float startx , float starty){ this.x=x; this.y=y; this.startx=startx; this.starty=starty; } public Point(){ } }
PointData.java(数据类)
package comm.ubi.util; import java.util.ArrayList; public class PointData{ public float leftx; public float lefty; public float rightx; public float righty; public int drawType; public ArrayList<Point> point = new ArrayList<Point>(); public PointData(float leftx , float lefty, float rightx, float righty, int drawType){ this.leftx=leftx; this.lefty=lefty; this.rightx=rightx; this.righty=righty; this.drawType=drawType; } public PointData(){ } public void Init() { this.leftx=0; this.lefty=0; this.rightx=0; this.righty=0; this.drawType=0; this.point.clear(); } }
相关文章推荐
- Webus Fox(1)免安装的在线教学、视频会议软件(含文本、语音、视频聊天、电子白板)
- 在线教学、视频会议 Webus Fox(1)文本、语音、视频聊天及电子白板基本用法
- 视频教程+源代码:FLEX+FMS实现远程共享、电子白板、远程交流会议
- 超低成本----音视频通讯+共享屏幕+电子白板
- Android平台上基于HTML5+WebRTC的视频会议系统
- 手机视频会议,手机视频教学,Android视频模块集成,IOS视频模块调用,快速集成
- TeleMCU视频会议之Android版本WebRTC 客户端支持
- osecvs 视频会议系统设计(一):白板数据传输
- FLEX+FMS实现远程共享、电子白板、远程交流会议的功能
- OMCS Demo -- 视频、音频、电子白板、远程桌面 功能基本展现(附源码)
- OMCS Demo -- 视频、音频、电子白板、远程桌面 功能基本展现(附源码)
- TeleMCU视频会议之Android版本号WebRTC client支持
- 基于WebRtc在H5视频聊天、视频教学、视频会议、视频直播、白板互动低延时方案
- Android电子白板
- jplogic 开发案例(FMS流媒体服务集成) 之 视频会议管理 (多人互动呼叫-应答模式视频会议含共享白板)
- Android平台上基于HTML5+WebRTC的视频会议系统
- OMCS Demo -- 视频、音频、电子白板、远程桌面 功能基本展现(附源码)
- android移动视频会议系统开发
- android视频会议系统实现思路
- 移动视频会议开发