Advertisement
Guest User

Untitled

a guest
Oct 13th, 2015
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.00 KB | None | 0 0
  1. package beta.calculator.facebamm.dbaum.calculator.demo;
  2.  
  3. import android.content.Context;
  4. import android.content.DialogInterface;
  5. import android.graphics.Bitmap;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Paint;
  9. import android.support.v7.app.AlertDialog;
  10. import android.util.AttributeSet;
  11. import android.util.Log;
  12. import android.view.MotionEvent;
  13. import android.view.View;
  14. import android.widget.ArrayAdapter;
  15. import android.widget.EditText;
  16. import android.widget.LinearLayout;
  17. import android.widget.ListView;
  18. import android.widget.TextView;
  19.  
  20. import java.util.ArrayList;
  21. import java.util.Random;
  22. import java.util.regex.Matcher;
  23. import java.util.regex.Pattern;
  24.  
  25. /**
  26.  * Created by DBaum on 11.10.2015.
  27.  */
  28. public class GraphPlotter {
  29.  
  30.     private KordinatenSystem KordinatenSystem;
  31.     private Context ctx;
  32.     private ArrayList<Funktion> Funktionen;
  33.     private HelpToolBox helpBox;
  34.     private Patter patterStg;
  35.     public  GraphPlotter(Context context)
  36.     {
  37.         ctx = context;
  38.         helpBox = new HelpToolBox(ctx);
  39.         KordinatenSystem = new KordinatenSystem(ctx);
  40.         Funktionen = new ArrayList<>();
  41.         patterStg = new Patter();
  42.     }
  43.     public void setStep(float x,float y)
  44.     {
  45.         KordinatenSystem.setStep(x,y);
  46.     }
  47.     public KordinatenSystem getKordinatenSystem()
  48.     {
  49.         return KordinatenSystem;
  50.     }
  51.     private void addFunction(String Funktion)
  52.     {
  53.  
  54.         Funktionen.add(new indikateString().scan(Funktion));
  55.         KordinatenSystem.invalidate();
  56.     }
  57.  
  58.     public void Add_AlertDialogBuilder(final LinearLayout Lay)
  59.     {
  60.  
  61.         final String[] Items = new String[] {"Point","Konstante"};
  62.         ListView Liste = new ListView(ctx);
  63.         AlertDialog.Builder Dialog = helpBox.getAlertDialogBuilder("Add...","",Liste);
  64.         ArrayAdapter<String> arrayAdapterItems = new ArrayAdapter<String>(ctx,android.R.layout.simple_expandable_list_item_1, Items);
  65.  
  66.         Dialog.setAdapter(arrayAdapterItems, new DialogInterface.OnClickListener() {
  67.             @Override
  68.             public void onClick(DialogInterface dialog, int which) {
  69.                 switch (which) {
  70.                     case 0:
  71.                         final View v = helpBox.getView(R.layout.dialog_point);
  72.                         AlertDialog.Builder Pointer = helpBox.getAlertDialogBuilder("Pointer", "", v);
  73.                         Pointer.setPositiveButton("Finish", new DialogInterface.OnClickListener() {
  74.                             @Override
  75.                             public void onClick(DialogInterface dialog, int which) {
  76.                                 EditText na = (EditText) v.findViewById(R.id.dialogPointer_Name);
  77.                                 EditText kx = (EditText) v.findViewById(R.id.dialogPointer_x);
  78.                                 EditText ky = (EditText) v.findViewById(R.id.dialogPointer_y);
  79.  
  80.                                 String Fun = String.format("%s=(%s/%s)", na.getText(), kx.getText(), ky.getText());
  81.  
  82.                                 TextView Tv = (TextView) helpBox.getView(R.layout.your_custom_view).findViewById(R.id.LabelText);
  83.                                 Tv.setText(Fun);
  84.                                 Tv.setOnClickListener(new View.OnClickListener() {
  85.                                     @Override
  86.                                     public void onClick(View v) {
  87.                                         //TODO Lösch Dialog und Bearbeitn Dialog
  88.                                     }
  89.                                 });
  90.                                 int Posi = Lay.getChildCount();
  91.                                 Lay.addView(Tv, Posi - 1);
  92.  
  93.                                 addFunction(Fun);
  94.                             }
  95.                         });
  96.                         Pointer.setNegativeButton("Canel", null);
  97.                         Pointer.create().show();
  98.                     case 1:
  99.                 }
  100.             }
  101.         }) ;
  102.         Dialog.setPositiveButton("Finish",null);
  103.         Dialog.create().show();
  104.     }
  105.  
  106.  
  107.  
  108.   private class indikateString {
  109.       private String Funktion;
  110.  
  111.       public Funktion scan(String Funk) {
  112.  
  113.           Funktion = Funk;
  114.           String Typ = checkString();
  115.           float[] Werte = getWerte(Typ);
  116.           return new Funktion(Typ,Funktion,Werte);
  117.       }
  118.  
  119.       private String checkString()
  120.       {
  121.           if(Funktion.matches(patterStg.PointPatter))
  122.               return patterStg.PointPatter;
  123.           if (Funktion.matches(patterStg.KonstantenPatter))
  124.               return patterStg.KonstantenPatter;
  125.  
  126.           return "Null";
  127.       }
  128.  
  129.       private float[] getWerte(String patter)
  130.       {
  131.           Pattern p = Pattern.compile(patter);
  132.           Matcher m = p.matcher(Funktion);
  133.           float[] Werte = new float[m.groupCount()];
  134.           int selection = 0;
  135.           while(m.find())
  136.           {
  137.               Werte[selection] = helpBox.STRGtoFloat(m.group()) ;
  138.               selection++;
  139.           }
  140.  
  141.           return  Werte;
  142.       }
  143.   }
  144.  
  145.     private class Funktion
  146.     {
  147.         public String Typ;
  148.         public String Aufgabe;
  149.         public float[] Werte;
  150.         public Paint color;
  151.         private Random R;
  152.         public Funktion(String Typ,String Aufgabe, float[] Wert)
  153.         {
  154.             this.Typ = Typ;
  155.             this.Aufgabe = Aufgabe;
  156.             this.Werte = Wert;
  157.  
  158.             R = new Random();
  159.             color = new Paint();
  160.             color.setColor(Color.argb(255,R.nextInt(255),R.nextInt(255),R.nextInt(255)));
  161.         }
  162.         public Funktion(String Typ,String Aufgabe, float[] Wert,Paint Color)
  163.         {
  164.             this.Typ = Typ;
  165.             this.Aufgabe = Aufgabe;
  166.             this.Werte = Wert;
  167.             color = Color;
  168.         }
  169.     }
  170.     public class Patter {
  171.         public static final String Zahl = "\\-?\\d+\\.?\\d+|\\-?\\d+";
  172.         public static final String PointPatter = "([\\w])=\\((\\-?\\d+\\.?\\d+|\\-?\\d+)\\/(\\-?\\d+\\.?\\d+|\\-?\\d+)\\)";
  173.         public static final String KonstantenPatter = "([\\w])?\\=(\\-?\\d+\\.?\\d+|\\-?\\d+)";
  174.     }
  175.     //region GraphPlotterView
  176.     public class KordinatenSystem extends View {
  177.         private Context ctx;
  178.         private Bitmap mBitmap;
  179.         private int width;
  180.         private int height;
  181.         private float[] step;
  182.         private float[] verschiebung;
  183.         private float[] mitte;
  184.         private Patter patternString = new Patter();
  185.         public ArrayList<String> Texte,PointerTxT;
  186.  
  187.         //region OnLoad
  188.         public KordinatenSystem(Context context) {
  189.             super(context);
  190.             ctx = context;
  191.             start();
  192.         }
  193.  
  194.         public KordinatenSystem(Context context, AttributeSet attrs) {
  195.             super(context, attrs);
  196.             ctx = context;
  197.             start();
  198.         }
  199.  
  200.         private void start()
  201.         {
  202.  
  203.             verschiebung = new float[]{0,0};
  204.             Texte = new ArrayList<>();
  205.             PointerTxT = new ArrayList<>();
  206.         }
  207.         //endregion
  208.  
  209.         //region Enstellung
  210.         public void setStep(float x,float y)
  211.         {
  212.             step = new float[]{x,y};
  213.             invalidate();
  214.         }
  215.         //endregion
  216.  
  217.         //region Canvas
  218.         @Override
  219.         protected void onDraw(Canvas canvas) {
  220.             super.onDraw(canvas);
  221.  
  222.             //region Kordinatensystem Zeichnen
  223.             float count_w = 0;
  224.             float count_h = 0;
  225.  
  226.             Paint mPaint = new Paint();
  227.             mPaint.setColor(Color.RED);
  228.             mPaint.setStrokeWidth(2f);
  229.  
  230.             Paint middlePaint = new Paint();
  231.             middlePaint.setStrokeWidth(6f);
  232.             middlePaint.setColor(Color.RED);
  233.  
  234.  
  235.             float stepx =  (width/step[0]);
  236.             float stepy =  (stepx*step[1])/step[0]; //(height / step[1]);
  237.  
  238.             for (float i = 1; i <= width + 1; i = i + stepx) {
  239.                 float xs = verschiebung[0] % stepx;
  240.                 canvas.drawLine(i + xs, 0, i + xs, height, mPaint);
  241.                 count_w++;
  242.             }
  243.  
  244.             for (float i = 1; i <= height + 1; i = i + stepy) {
  245.                 float ys = verschiebung[1] % stepy;
  246.                 canvas.drawLine(0, i + ys, width, i + ys, mPaint);
  247.                 count_h++;
  248.             }
  249.  
  250.             float mittex = count_w / 2 * stepx;
  251.             float mittey = count_h / 2 * stepy;
  252.  
  253.             if ((int)mittex % 2 == 0) {
  254.                 Log.d("bbx", String.valueOf((int) mittex));
  255.                 mittex = mittex - (stepx / 2);
  256.             }
  257.  
  258.             if (step[1] % 2 == 0) {
  259.                 Log.d("bby", String.valueOf((int) mittey));
  260.                 mittey = mittey - (stepy / 2);
  261.             }
  262.             mitte = new float[]{mittex + verschiebung[0],mittey + verschiebung[1]};
  263.             canvas.drawLine(mitte[0], 0, mitte[0], height, middlePaint);
  264.             canvas.drawLine(0,mitte[1] , width,mitte[1], middlePaint);
  265.             //endregion
  266.  
  267.             //region Zeichnen der Einzelnen Funktionen
  268.             if(Funktionen != null) {
  269.                 int pCount = Funktionen.size()- 1;
  270.                 for (int i = 0; i <= pCount; i++) {
  271.                     Funktion Item = Funktionen.get(i);
  272.                     switch (Item.Typ)
  273.                     {
  274.                         case Patter.PointPatter:
  275.                             float Px = (Item.Werte[1] * stepx) + mitte[0];
  276.                             float Py = (Item.Werte[2] * stepy) + mitte[1];
  277.                             Log.d("Point", String.valueOf("S(" + Px + "|" + Py + ")"));
  278.                             canvas.drawLine(Px - 15, Py - 15, Px + 15, Py + 15, Item.color);
  279.                             canvas.drawLine(Px + 15, Py - 15, Px - 15, Py + 15, Item.color);
  280.                             break;
  281.                         //case :
  282.                         //    P_to_PFun p2p = Item.P2P_Fun;
  283.                         //    float Startx = -500f;
  284.                         //    float Endx = 500f;
  285.                         //    float starty = (p2p.m * Startx) + p2p.n;
  286.                         //    float endy = (p2p.m * (Startx*-1)) + p2p.n;
  287.                         //    canvas.drawLine(
  288.                         //            (Startx * stepx) + mitte[0],(starty* stepx) + mitte[1],
  289.                         //            (Endx * stepx) + mitte[0],(endy* stepx) + mitte[1],Item.pointerC);
  290.                         //    break;
  291.                     }
  292.                 }
  293.             }
  294.             //endregion
  295.         }
  296.         //endregion
  297.  
  298.         //region GrößenVeränderung
  299.         @Override
  300.         protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  301.             super.onSizeChanged(w, h, oldw, oldh);
  302.             mBitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
  303.             height = h;
  304.             width = w;
  305.         }
  306.         //endregion
  307.  
  308.         //region Touchbewegung
  309.         private float px,py;
  310.         private float touchx,touchy;
  311.         private static final int INVALID_POINTER_ID = -1;
  312.         private int ActivePointer = INVALID_POINTER_ID;
  313.         private int newActivePointer = INVALID_POINTER_ID;
  314.  
  315.         @Override
  316.         public boolean onTouchEvent(MotionEvent event) {
  317.             int PointerC = event.getPointerCount();
  318.             switch(PointerC) {
  319.                 case 1:
  320.                     //region EinzelnerTouch
  321.                     switch (event.getActionMasked()) {
  322.                         case MotionEvent.ACTION_DOWN:
  323.                             px = verschiebung[0];
  324.                             py = verschiebung[1];
  325.                             touchx = event.getRawX();
  326.                             touchy = event.getRawY();
  327.                             break;
  328.                         case MotionEvent.ACTION_MOVE:
  329.                             verschiebung[0] = ((px + (event.getRawX() - touchx)));
  330.                             verschiebung[1] = ((py + (event.getRawY() - touchy)));
  331.                             break;
  332.                     }
  333.                     break;
  334.                 //endregion
  335.                 case 2:
  336.  
  337.                     //region MultiTouch
  338.                     switch(event.getActionMasked())
  339.                     {
  340.                         case MotionEvent.ACTION_DOWN:
  341.                             if (ActivePointer == INVALID_POINTER_ID) {
  342.                                 ActivePointer = event.getPointerId(0);
  343.                             } else {
  344.                                 newActivePointer = event.getPointerId(1);
  345.                             }
  346.                             break;
  347.                         case MotionEvent.ACTION_MOVE:
  348.                             break;
  349.                         case MotionEvent.ACTION_CANCEL:
  350.                             ActivePointer = INVALID_POINTER_ID;
  351.                             newActivePointer = INVALID_POINTER_ID;
  352.                             break;
  353.                     }
  354.                     //endregion
  355.             }
  356.             invalidate();
  357.             return true;
  358.         }
  359.         //endregion
  360.  
  361.     }
  362.     //endregion
  363.  
  364.  
  365. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement