Android 在一个框架中创建多个部分,并使每个部分单独工作
我一直在开发一个类似于的应用程序,我是如何成功地执行此任务并创建代码来制作这样的帧的,我使用了一个多点触控视图类,它是 多点触控视图类Android 在一个框架中创建多个部分,并使每个部分单独工作,android,android-layout,image-processing,xml-layout,Android,Android Layout,Image Processing,Xml Layout,我一直在开发一个类似于的应用程序,我是如何成功地执行此任务并创建代码来制作这样的帧的,我使用了一个多点触控视图类,它是 多点触控视图类 import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.gra
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* Canvas View for the MultiTouch controller
* @author 2dwarfs.com
*
*/
public class MultiTouchView extends View implements MultiTouchObjectCanvas<PinchWidget> {
private static final int UI_MODE_ROTATE = 1;
private static final int UI_MODE_ANISOTROPIC_SCALE = 2;
private int mUIMode = UI_MODE_ROTATE;
ArrayList<PinchWidget> alist = new ArrayList<PinchWidget>();
private MultiTouchController<PinchWidget> mMultiTouchController = new MultiTouchController<PinchWidget>(this);
private int mWidth, mHeight;
private PinchWidget mPinchWidget;
private Context mContext;
public MultiTouchView(Context context) {
super(context);
//mContext = context;
}
public void clearCache(){
alist.clear();
}
public MultiTouchView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
}
public MultiTouchView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setPinchWidget(Bitmap bitmap) {
mPinchWidget = new PinchWidget(bitmap);
alist.add(mPinchWidget);
mPinchWidget.init(mContext.getResources());
invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mWidth = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
mHeight = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(mWidth, mHeight);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.TRANSPARENT);
for(PinchWidget mmPinchWidget : alist )
mmPinchWidget.draw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return mMultiTouchController.onTouchEvent(ev);
}
@Override
public PinchWidget getDraggableObjectAtPoint(PointInfo pt) {
float x = pt.getX(), y = pt.getY();
for(PinchWidget mPinchWidget : alist) {
if (mPinchWidget.containsPoint(x, y)) {
return mPinchWidget;
}
}
return null;
}
@Override
public void getPositionAndScale(PinchWidget pinchWidget, PositionAndScale objPosAndScaleOut) {
objPosAndScaleOut.set(pinchWidget.getCenterX(), pinchWidget.getCenterY(),
(mUIMode & UI_MODE_ANISOTROPIC_SCALE) == 0,
(pinchWidget.getScaleFactor() + pinchWidget.getScaleFactor()) / 2,
(mUIMode & UI_MODE_ANISOTROPIC_SCALE) != 0,
pinchWidget.getScaleFactor(),
pinchWidget.getScaleFactor(),
(mUIMode & UI_MODE_ROTATE) != 0,
pinchWidget.getAngle());
}
@Override
public boolean setPositionAndScale(PinchWidget pinchWidget, PositionAndScale newImgPosAndScale, PointInfo touchPoint) {
boolean ok = pinchWidget.setPos(newImgPosAndScale, mUIMode, UI_MODE_ANISOTROPIC_SCALE, touchPoint.isMultiTouch());
if(ok) {
invalidate();
}
return ok;
}
@Override
public void selectObject(PinchWidget pinchWidget, PointInfo touchPoint) {
if(touchPoint.isDown()) {
mPinchWidget = pinchWidget;
}
invalidate();
}
}
import java.util.ArrayList;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.util.AttributeSet;
导入android.view.MotionEvent;
导入android.view.view;
/**
*多点触控控制器的画布视图
*@author 2dwarfs.com
*
*/
公共类MultiTouchView扩展视图实现MultitouchObject画布{
专用静态最终内部用户界面模式旋转=1;
专用静态最终内部用户界面模式各向异性比例=2;
私有int mUIMode=UI_模式_旋转;
ArrayList alist=新的ArrayList();
专用多点触控器MMMultiTouchController=新的多点触控器(此);
私人内特米维兹,mHeight;
私有PinchWidget mPinchWidget;
私有上下文;
公共多点触控视图(上下文){
超级(上下文);
//mContext=上下文;
}
公共void clearCache(){
a.clear();
}
公共多点触控视图(上下文、属性集属性){
超级(上下文,attrs);
mContext=上下文;
}
公共多点触控视图(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
公共void setPinchWidget(位图){
mPinchWidget=新的PinchWidget(位图);
alist.add(mPinchWidget);
init(mContext.getResources());
使无效();
}
@凌驾
测量时的保护空隙(内部宽度测量等级、内部高度测量等级){
mWidth=resolveSize(getSuggestedMinimumWidth(),widthMeasureSpec);
mHeight=resolveSize(getSuggestedMinimumHeight(),heightMeasureSpec);
设置测量尺寸(米宽,米高);
}
@凌驾
公共空白onDraw(画布){
super.onDraw(帆布);
画布。drawColor(颜色。透明);
for(PinchWidget mmPinchWidget:alist)
mmPinchWidget.draw(画布);
}
@凌驾
公共事件(MotionEvent ev){
返回MMMultiTouchController.onTouchEvent(ev);
}
@凌驾
公共PinchWidget GetDragableObjectAtPoint(PointInfo pt){
浮点x=pt.getX(),y=pt.getY();
for(PinchWidget mPinchWidget:alist){
if(mPinchWidget.containsPoint(x,y)){
返回mPinchWidget;
}
}
返回null;
}
@凌驾
public void getPositionAndScale(PinchWidget-PinchWidget,PositionAndScale-objPosAndScaleOut){
objPosAndScaleOut.set(pinchWidget.getCenterX(),pinchWidget.getCenterY(),
(mUIMode和UI_模式_各向异性_比例)==0,
(pinchWidget.GetScaleActor()+pinchWidget.GetScaleActor())/2,
(mUIMode和UI_模式_各向异性_比例)!=0,
pinchWidget.GetScaleActor(),
pinchWidget.GetScaleActor(),
(mUIMode和UI模式旋转)!=0,
pinchWidget.getAngle());
}
@凌驾
公共布尔设置位置和缩放(PinchWidget PinchWidget,位置和缩放新建imgPosAndScale,PointInfo接触点){
布尔ok=pinchWidget.setPos(newImgPosAndScale、mUIMode、UI_MODE_各向异性_SCALE、touchPoint.isMultiTouch());
如果(确定){
使无效();
}
返回ok;
}
@凌驾
public void selectObject(PinchWidget PinchWidget、PointInfo接触点){
if(touchPoint.isDown()){
mPinchWidget=pinchWidget;
}
使无效();
}
}
并在XMl文件中使用此框架,如
用于两个帧的Two.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/transparent"
android:orientation="horizontal" >
<com.example.imageframe.MultiTouchView
android:orientation="horizontal"
android:id="@+id/firstone"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="5.0dip"
android:layout_marginLeft="5.0dip"
android:layout_marginRight="5.0dip"
android:layout_marginTop="5.0dip"
android:layout_weight="0.5"
android:background="@drawable/back" />
<com.example.imageframe.MultiTouchView
android:orientation="horizontal"
android:id="@+id/secondone"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="5.0dip"
android:layout_marginRight="5.0dip"
android:layout_marginTop="5.0dip"
android:layout_weight="0.5"
android:background="@drawable/back" />
</LinearLayout>
但是在编写代码时,我认为创建和使用这样的帧是一种非常复杂的方法。此外,这些框架的形状特别是方形/矩形,我无法制作边缘弯曲的框架或动态更改框架形状(使框架分区变大/变小或更改框架形状)
为了找到一个合适的解决方案,我已经搜索了每一件事,但没有成功
请尽快指导我动态创建/操作/编辑框架,或提供一些代码片段来实现此类功能。您可以使用fragment。单独设计布局。例如fragmentNumberOne.xml和fragmentNumberWO.xml 在主要活动的xml中放置框架布局
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Fragment fragment = new YourFragment();
Bundle args = new Bundle();
args.putInt("fragmentLayout", R.layout.fragmentNumberOne);
fragment.setArguments(args);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment).commit();
创建一个类,如:
public class YourFragment extends Fragment {
public YourFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
int fragmentLayout = getArguments().getInt("fragmentLayout");
final View rootView = inflater
.inflate(fragmentLayout, container, false);
if (fragmentLayout == R.layout.fragmentNumberOne) {
...
write your code here
...
} else if (fragmentLayout == R.layout.fragmentNumberTwo) {
...
write your code here
...
}
return rootView;
}
您可以将所需视图的可见性设置为“已消失”,否则在需要时可见