2014-02-12 3 views
4

Pic Frame, Insta collage과 유사한 응용 프로그램에서 작업했습니다.이 작업을 수행하는 데 성공한 방법과 이와 같은 프레임을 만드는 코드를 만들었습니다. 멀티 터치한 프레임에 여러 섹션 만들기 및 모든 섹션이 싱글 톤으로 작동하도록

MultiTouchview 클래스

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(); 
    } 
} 

입니다 그리고 사용하는 뷰 클래스는이 두 개의 프레임

에 대한

Two.xml 같은 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> 

하지만 생성하고이 같은 프레임을 사용하기는 매우 복잡한 방법을 생각 코딩하는 동안. 또한이 프레임들은 특별히 정사각형/사각형입니다. 곡선이있는 테두리가있는 프레임을 만들거나 프레임 모양을 변경 (프레임 분할을 크거나 작게 또는 프레임 모양을 동적으로 변경) 할 수 없습니다.

나는이 솔루션을 달성하기 위해 적절한 해결책을 찾기 위해 모든 일을 검색하지만 성공하지 않았습니다.

빨리 만들 가능한 한 저를 인도 해주십시오/동적/편집 프레임을 조작하거나 나에게 이런 종류의 기능을 달성하기 위해 몇 가지 코드를 제공합니다.

+0

필요할 때 필요한보기를 "사라"표시 할 수 있습니다. – user2609847

답변

0

당신은 조각을 사용할 수 있습니다. 레이아웃을 별도로 설계하십시오. 예를 들어 fragmentNumberOne.xml 및 fragmentNumberTwo.xml에 대한

주요 활동으로 XML에 FrameLayout이를 넣어;

<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; 
}