Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

이곳저곳 관심이 많아요

13. 그래픽(1) 본문

카테고리 없음

13. 그래픽(1)

킹수맨 2021. 12. 7. 17:39
  • 커스텀 뷰 클래스 사용
    • 간단한 선 그리기
      class MainActivity : AppCompatActivity(){
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              //setContentView(R.layout.activity_main)
      
              //커스텀 뷰 사용
              val myView:MyView = MyView(this)
              setContentView(myView)
      
          }
          class MyView: View{
              constructor(context: Context):super(context){
                  setBackgroundColor(Color.YELLOW)
              }
              override fun onDraw(canvas: Canvas?) {
                  super.onDraw(canvas)
                  if(canvas == null) return       //캔버스객체가 null이 아니어야 함
      
                  //높이와 폭 변수
                  val w = width.toFloat()
                  val h = height.toFloat()
      
                  //페인트 객체를 꼭 생성해야함(펜이 있어야 그림을 그림)
                  val paint = Paint()
                  paint.setARGB(255,255,0,0)  //색상설정
                  paint.strokeWidth = 10f      //굵기설정
                  canvas.drawLine(0f,50f,w,50f,paint) //마지막에 꼭 paint 넣어주기
              }
          }
      }​
    • 랜덤 점 찍기
      class MainActivity : AppCompatActivity(){
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              //setContentView(R.layout.activity_main)
      
              //커스텀 뷰 사용
              val myView:MyView = MyView(this)
              setContentView(myView)
      
          }
          class MyView(context: Context): View(context){
              init{
                  setBackgroundColor(Color.BLACK)
              }
              override fun onDraw(canvas: Canvas?) {
                  super.onDraw(canvas)
                  if(canvas == null) return       //캔버스객체가 null이 아니어야 함
      
                  val paint = Paint()
                  paint.setARGB(255,255,255,255)
                  for(x in 1..1000){
                      var dx = (Math.random()*width).toFloat()
                      var dy = (Math.random()*height).toFloat()
                      canvas.drawPoint(dx,dy,paint)
                  }
              }
          }
      }​
    • RectF
      - left, top, right, bottom 의 점 정보를 담고 있는 클래스
      class MainActivity : AppCompatActivity(){
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              //setContentView(R.layout.activity_main)
      
              //커스텀 뷰 사용
              val myView:MyView = MyView(this)
              setContentView(myView)
      
          }
          class MyView(context: Context): View(context){
              init{
                  setBackgroundColor(Color.BLACK)
              }
              override fun onDraw(canvas: Canvas?) {
                  super.onDraw(canvas)
                  if(canvas == null) return       //캔버스객체가 null이 아니어야 함
                  val paint = Paint()
      
                  val r1 = RectF(10f,10f,110f,110f)
                  val r2 = RectF(150f,10f,350f,100f)
                  val r3 = RectF(10f,120f,110f,220f)
      
                  paint.color = Color.YELLOW
                  canvas.drawRoundRect(r1,5f,5f,paint)    //모서리가 둥근 사각형
                  canvas.drawOval(r2,paint)       //타원
      
                  paint.color = Color.RED
                  //(점, 호 파인거 시작, 호 파인거 끝, 파인 부분 원점이랑 연결할지, 펜)
                  canvas.drawArc(r3,120f,270f,true,paint) //호
      
                  paint.color = Color.YELLOW
                  paint.strokeWidth = 10f
                  val pts = floatArrayOf(10f, 250f, 100f, 270f,   //여러개의 라인 그리기
                      100f, 270f, 20f, 290f,
                      20f, 290f, 120f, 300f)
                  canvas.drawLines(pts,paint)
              }
          }
      }
    • 커스텀 뷰를 xml 에 적용하기
      class MainActivity : AppCompatActivity(){
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_main)
          }
      
          class MyView: View {
              constructor(context: Context): super(context)  {
                  setBackgroundColor(Color.YELLOW)
              }
              //코틀린 코드에서 만든 것을 xml 에 포함시킬 때 반드시 필요한 생성자
              constructor(context: Context, attrs: AttributeSet): super(context, attrs)  {
                  setBackgroundColor(Color.YELLOW)
              }
              override fun onDraw(canvas: Canvas?) {
      
                  super.onDraw(canvas)
                  if(canvas == null) return       //캔버스객체가 null 이 아니어야 함
                  val paint = Paint()
      
                  val r = RectF(100f,100f,300f,300f)
      
                  //속이 빈 사각형 그리기
                  paint.style = Paint.Style.STROKE
                  paint.strokeWidth = 20f
                  canvas.drawRect(r,paint)
      
                  paint.color = Color.RED
                  paint.style = Paint.Style.FILL
                  canvas.drawArc(r,90f,270f,false, paint)
              }
          }
      }​
    • 내장 폰트 설정
      class MainActivity : AppCompatActivity(){
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_main)
          }
      
          class MyView: View {
              constructor(context: Context): super(context)  {
                  setBackgroundColor(Color.YELLOW)
              }
              //코틀린 코드에서 만든 것을 xml 에 포함시킬 때 반드시 필요한 생성자
              constructor(context: Context, attrs: AttributeSet): super(context, attrs)  {
                  setBackgroundColor(Color.YELLOW)
              }
              override fun onDraw(canvas: Canvas?) {
                  super.onDraw(canvas)
                  if(canvas == null) return       //캔버스객체가 null 이 아니어야 함
                  val paint = Paint()
                  paint.textSize = 50f
      
                  var t = Typeface.create(Typeface.DEFAULT,Typeface.NORMAL)
                  paint.typeface = t
                  canvas.drawText("DEFAULT 폰트",10f,100f,paint)
      
                  t = Typeface.create(Typeface.MONOSPACE, Typeface.BOLD)
                  paint.typeface = t
                  canvas.drawText("MONOSPACE 폰트", 10f, 200f, paint)
      
                  t = Typeface.create(Typeface.SERIF, Typeface.BOLD_ITALIC)
                  paint.typeface = t
                  canvas.drawText("SERIF 폰트", 10f, 300f, paint)
      
                  t = Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC)
                  paint.typeface = t
                  canvas.drawText("SANS_SERIF 폰트", 10f, 400f, paint)
              }
          }
      }​
    • 외부 폰트 설정
      class MyView: View {
          constructor(context: Context): super(context)  {
              setBackgroundColor(Color.YELLOW)
          }
          //코틀린 코드에서 만든 것을 xml 에 포함시킬 때 반드시 필요한 생성자
          constructor(context: Context, attrs: AttributeSet): super(context, attrs)  {
              setBackgroundColor(Color.YELLOW)
          }
          override fun onDraw(canvas: Canvas?) {
              super.onDraw(canvas)
              if(canvas == null) return       //캔버스객체가 null 이 아니어야 함
              val paint = Paint()
              paint.textSize = 50f
      
              try{
                  val myFont = Typeface.createFromAsset(context.assets,"ScriptoniteDemo.ttf")
                  paint.typeface = myFont
                  canvas.drawText("This is a new font",10f,100f,paint)
              }catch (e:Exception){
                  e.printStackTrace()
              }
          }
      }​
    • Activity에서 bitmap 이미지 출력
      class MainActivity : AppCompatActivity(){
          
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
      
              //그림을 그리는 공간 생성
              val myBitmap = Bitmap.createBitmap(800,600,Bitmap.Config.ARGB_8888)
      
              //비트맵 공간의 배경색을 파랑색으로
              val myCanvas = Canvas(myBitmap)
              myCanvas.drawColor(Color.argb(255,0,0,255))
      
              val paint = Paint()         //페인트 객체 생성하고
              paint.textSize = 100f       //글자크기 설정
              paint.color = Color.argb(255,255,255,255)   //페인트 색상 설정
              myCanvas.drawText("Hello World!",100f,100f,paint)
      
              paint.color=Color.argb(255,255,255,0)
              myCanvas.drawCircle(400f,300f,100f,paint)
      
              //ImageView 객체에 비트맵 공간에서 그린 것을 전달
              val myImageView = ImageView(this)
              myImageView.setImageBitmap(myBitmap)
              setContentView(myImageView) //ImageView 객체를 화면에 출력
          }
          
      }​
    • 이미지 리소스를 비트맵 객체로 변환해 화면에 출력
      class MainActivity : AppCompatActivity(){
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(MyView(this))
          }
      
          class MyView(context: Context): View(context) {
              override fun onDraw(canvas: Canvas?) {
                  super.onDraw(canvas)
                  if (canvas == null) return
      
                  canvas.drawColor(Color.LTGRAY)      //캔버스의 배경색 설정
      
                  val paint = Paint()     //페인트 객체 생성
                  val b: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.harubang)    //리소르->비트맵 변환
                  canvas.drawBitmap(b,0f,0f,null)
                  
              }
          }
      }​
    • 부분 이미지 확대 및 축소

 

Comments